【问题标题】:XML Escaping ignores accentuated charactersXML 转义忽略重音字符
【发布时间】: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


【解决方案1】:

如果 XML 编码是 UTF-8(默认),则不需要将特殊字符转换为数字实体。所以你有一个可疑的接收器。正如 javadocs 所说,escapeXml11 确实是有限的。

翻译String xml的所有非ASCII字符:

xml = xml.codePoints()
    .map(cp -> cp < 128 ? Character.toString(cp) : String.format("&#%d;", cp))
    .collect(Collectors.joining());

您甚至可以设置encoding="US-ASCII"

【讨论】:

  • 是的,我也会得出结论,接收方有问题。你的方法对我很有效,recv。 side 现在能够完全解析我的请求。我想知道为什么大多数库只支持有限的范围。这在某种程度上适用于许多人。
  • 在 java 中有一个问题,有时两个 chars 形成一个 Unicode 代码点。因此,使用带有 lambda 的 `Pattern.Matcher.replaceAll 不适用于亚洲脚本。然而,在这里我只能猜测使用的编码表。这简直是​​愚蠢的。
猜你喜欢
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
  • 2016-05-05
相关资源
最近更新 更多