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

时间:2016-05-10 15:34:09

标签: java postgresql unicode diacritics unicode-normalization

我正在接收带有分解的diacretics 的UTF-8中的xml文档。

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

现在我发现,当搜索像“Wüste”这样的值手动输入(HEX:57 c3 bc 73 74 65)时,我无法找到之前插入的值外部资源“Wüste”(HEX: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()

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

1 个答案:

答案 0 :(得分:1)

PostgreSQL(以及底层操作系统区域设置库)并不能很好地支持这一点。如您所说,在将数据传递到数据库之前对数据进行规范化,这可能是最好的。