【问题标题】:Are these characters valid for XML?这些字符对 XML 有效吗?
【发布时间】:2020-11-17 17:57:44
【问题描述】:

这是有效的 XML 数据(尤其是 messageContent 的值)吗?

我从 API 获取它。

然后,当我将此 XML 传递给 Postgres 函数以保存到 Postgres DB 时,我得到一个错误。

<rows>

<row messageDateUTC="2020-06-01T21:20:37.120" 

texterAddress="" texterStreet="" messageContent="Hey beautiful it&apos;s Scott!&#55357;&#56842;"  />


</rows>

我想知道这是 API 问题,还是生成 XML 的客户端模块的问题,或者 Postgres 有问题并且无法处理这些字符。

此处出错:

Caused by: org.postgresql.util.PSQLException: ERROR: invalid XML content
  Detail: line 5: xmlParseCharRef: invalid xmlChar value 55357
ddress="" texterStreet="" messageContent="Hey beautiful it&apos;s Scott!&#55357;
                                                                               ^
line 5: xmlParseCharRef: invalid xmlChar value 56842
" texterStreet="" messageContent="Hey beautiful it&apos;s Scott!&#55357;&#56842;
                                                                               ^
line 23: chunk is not well balanced

【问题讨论】:

标签: java xml postgresql unicode


【解决方案1】:

tl;dr 不,它们是无效的,无论编码是错误的还是被告知有关输入的错误编码信息。

55357 和 56842 分别是十六进制的 0xD83D 和 0xDE0A。

在 Unicode 中,它们分别位于称为“High Surrogate”和“Low Surrogate”的范围内。

这意味着它们不是正确的 Unicode 代码点,而是在 UTF-16 中用于构造不适合 16 位的单个 Unicode 值(即基本多语言平面)。

这两个特定值解码为U+1F60A SMILING FACE WITH SMILING EYES。正确的十进制 HTML 实体是 &amp;#128522;

最可能的原因是某些不了解 UTF-16 或 认为此文本不是 UTF-16 的转换进行了编码(但应该检测到这些值即使在这种情况下也无效并报告错误)。

【讨论】:

  • 嗯...是的,我注意到这是一些微笑/表情符号。非常感谢...我会做更多的研究,看看是谁生产了这些,有点难以追踪,但让我们看看。
  • API 的 XML 响应显示编码 UTF-8... 但在我看来,表情符号是用 UTF-16 编码的。我该如何验证呢?换句话说,该表情符号应该如何以 UTF-8 编码(响应声称其编码是)?
  • API 可能已经提供了错误的数据。一个常见的错误是将 UTF-16 编码的数据再次编码为 UTF-8,但将其视为 UCS-2(这是在 UTF-16 得到广泛采用之前流行的固定宽度 2 字节编码)。如果是这种情况,那么您应该在 API 的字节流中看到字节 0xED 0xA0 0xBD。最好的方法是修复 API,但您可能能够对数据进行后处理以修复此问题(因为它不应丢失任何信息)。
  • 实际上,如果 API 已经提供 XML,那么这些字节可能不会显示,并且它会完全按照您在上面发布的内容报告文本:作为 ASCII 兼容字符形成十进制 XML 实体 (即&amp;#55357;)。如果出现这种情况,那么从技术上讲,API 已经交付了格式错误的 XML。如果上述 字节出现在 API 中,则 API 有问题。
  • 不,API 提供了不同的 XML,我在这里介绍了这个 - 这是我从 API 的原始格式形成的 XML 格式。你看……这个响应会经过多层,所以很棘手。例如。我在客户端使用 Jersey 来读取 XML。我是否可能需要以某种方式配置泽西岛?我对此表示怀疑,因为来自 API 的原始 XML 似乎是 UTF-8。所以它必须是UTF-8。我从 API 获得的原始 XML - 我什至不确定如何查看该表情符号的原始字节。我再想一想。
猜你喜欢
  • 1970-01-01
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 2021-04-12
  • 2010-11-25
  • 1970-01-01
相关资源
最近更新 更多