如何处理来自外部源的分解 unicode 并将其存储在 postgresql 中

How to deal with decomposed unicode from external source and store it in postgresql

我收到 xml 个 UTF-8 文件,其中 分解变音符号

直到现在,我只是读取值并将它们保存到我的 postgreSQL 数据库中,而没有进行任何修改或转换(psotgreSQL 参数:SERVER_ENCODING=UTF8,LC_COLLATE=German_Germany。 1252).

现在我发现,当搜索像 "Wüste" 这样的值时手动输入(十六进制:57 c3 bc 73 74 65),我无法找到先前从该外部资源 "Wüste" 插入的值(十六进制:57 75 cc 88 73 74 65)。

我在 Notepad++ HexEditor 中查看这两个字符串时发现它们不同。

我正在尝试找出解决此问题的正确方法。

目前我会尝试使用 java.text.Normalizer 并在从外部源读取文本时尝试规范化文本,如下所示:

String normalized = Normalizer.normalize(original, Normalizer.Form.NFC);

但在此之前,我想确保我没有遗漏任何其他内容。也许我可以而且应该在从外部源读取数据时解决这个问题?也许我需要提供正确的编码?也许我可以设置另一个参数,这样我就不需要自己做任何标准化了?

我是这样读取数据的:

URL url = new URL(buildSearchUrl(searchCriteria, key));
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
String expression = "/s:searchRetrieveResponse/s:records/s:record/s:recordData";
DocumentBuilder db = dbf.newDocumentBuilder();
InputStream is = url.openStream();
Document dnbResultDocument = db.parse(is);
Node recordDataElem = (Node) xpath.compile(expression).evaluate(
dnbResultDocument, XPathConstants.NODE);

然后我继续读取不同的节点并使用

获取它们的文本值
element.getTextContent()

我很难相信我必须手动规范化从所述外部资源获得的每个文本。

PostgreSQL(和底层操作系统语言环境库)并没有很好地支持这一点。如您所述,最好在将数据传递给数据库之前对其进行规范化。