【发布时间】:2021-07-22 19:32:37
【问题描述】:
我正在尝试发送 POST 请求,其中请求正文包含 XML。 接收 API 要求任何特殊字符都应使用数字 xml-entities 进行编码。
让我们举个例子:
İlkay Gündoğan
在使用org.apache.commons.text.StringEscapeUtils 等标准库进行xml 转义或使用Jsoup 和XML-Parser 之后,它只会产生:
İlkay Gündoğan,但它忽略了İ 和ğ。我已经阅读了那些提到的库的文档,并读到只有一定范围的字符被转义。
- 为什么这些库只转换特定范围?
- 是否有任何 jvm 库,支持转义重音字符,如
İ和ğ。
我已经尝试将手动制作的示例 (İlkay Gündoğan) 发送到 recv。 API 并按预期工作。
所有值都以 UTF-8 写入和读取。
【问题讨论】:
-
仔细检查您的区域设置
-
如果所有值都以 UTF-8 写入和读取,那么您不需要转义这些字符中的任何。如果接收 API 要求这样做,则它不接受有效的 XML。数字 XML 实体和实际字符在有效的 XML 处理器中应该是等价的。 “特殊字符”的定义也难以置信。 tl;dr 如果您需要这个,您必须自己构建它,因为这不是标准要求。
-
@JoachimSauer 不能 100% 确定,如果 recv. API 以 UTF-8 读取,但在他们的规范中提到,以及他们期望编码的 xml-entities。如果我有一个能够在数字实体中转义这些字符的库,那么这个问题将为我解决
-
@lunatikz:有没有提到它认为是“特殊字符”?
-
@lunatikz:老实说,这有点傻。 XML 特别是 有一个编码标头以允许使用任何编码,尤其是像 UTF-8 这样不需要转义非 ASCII 字符的编码。如果他们继续要求他们被转义,那么他们就破坏了 XML 的基本思想(即他们付出了所有的代价却没有得到任何好处)。您可以尝试将您的 XML 库配置为显式使用 ASCII 作为编码,这应该使其自动转义所有非 ASCII 字符。
标签: java xml unicode encoding unicode-escapes