c++ - XML 中的 UTF 8 编码日文字符串

标签 c++ xml unicode character

我正在尝试使用日语字符串创建 SOAP 调用。我遇到的问题是,当我将此字符串编码为 UTF8 编码字符串时,其中包含许多控制字符(例如 0x1B (Esc))。如果我删除所有此类控制字符以使其成为有效的 SOAP 调用,则日语内容在服务器端显示为垃圾。 如何为日语字符创建有效的 SOAP 请求?非常感谢任何建议。 我正在使用带有 MS-DOM 的 C++。

致以最诚挚的问候。

最佳答案

如果我没记错的话,前 32 个 unicode 代码点不允许作为 XML 文档中的字符,即使使用 &# 进行转义也是如此。 .不确定它们是否在 HTML 中被允许,但服务器肯定认为它们在您的请求中是不允许的,并且它获得了唯一有意义的投票。

我注意到您的文档声称编码为 iso-2022-jp , 不是 utf-8 .事实上,字符序列 ESC $ B出现在您文档中的是有效的 iso-2022-jp。它表示数据正在切换编码(从 ASCII 到称为 JIS X 0208-1983 的 2 字节日文编码)。

但是在构造您的请求的过程中的某个地方,有人看到了 0x1B字节并将其解释为字符 U+001B,却没有意识到它的目的是作为已经在文档编码中编码的数据中的一个字节。因此,它已将 XML 转义为“最大努力”,即使那不是有效的 XML。

很可能,无论什么序列化您的 XML 文档都不知道编码应该是 iso-2022-jp .我想它认为它应该将文档序列化为 ASCII、ISO-Latin-1 或 UTF-8,以及 <meta>元素对它没有任何意义(这是一种指定编码的 HTML 方式,它在 XML 中没有特别的意义)。但我不知道 MS-DOM,所以我不知道如何更正。

如果您只是删除 ESC来自 iso-2022-jp 数据的字符,那么你隐藏了数据已经切换编码的事实,因此解码器将继续解释所有 7nMK东西作为 ASCII,当它应该被解释为 JIS X 0208-1983 时。因此,垃圾。

还有一些奇怪的 -- iso-2022-jp切换回 ASCII 的代码是 ESC ( B , 但我看到 |(B</font>在您的数据中,当我期望第二个 ESC 字符发生与第一个相同的事情时:&#0x1B(B</font> .同样,$B#M#S(B$BL@D+(B是从 ASCII 切换到 JIS X 0208-1983 并返回的失败尝试,然后又是 ESC字符只是消失而不是被转义。

我无法解释为什么有些 ESC字符已经消失并且一个已经被转义,但是您生成的内容看起来几乎但不完全像有效的 iso-2022-jp 并不是巧合.我认为 iso-2022-jp 是 7 位编码,所以部分问题可能是您获取了 iso-2022-jp 数据,并通过转换 ISO-Latin-1(或其他一些 8下半部分匹配 ASCII 的位编码,例如任何 Windows 代码页)到 UTF-8。如果是,则此函数保持 7 位数据不变,不会将其转换为 UTF-8。然后当解释为 UTF-8 时,数据中有 ESC 字符。

如果你想以 UTF-8 格式发送数据,那么首先你需要将它从 iso-2022-jp 中实际转换出来(转换为宽字符或 UTF-8,无论你的 SOAP 或 XML 库期望哪个) .其次,您需要将其标记为 UTF-8,而不是 iso-2022-jp。最后,您需要将整个文档序列化为 UTF-8,尽管正如我所说,您可能已经在这样做了。

关于c++ - XML 中的 UTF 8 编码日文字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10947137/

相关文章:

c++ - 将二维的一部分复制到自身上

c++ - 如何从 QDeclarativeView 获取指向某个 qml 元素的指针?

xml - XSD 元素基数 - 如何建模 'One of the fields is mandatory'

java - 如何自定义 jaxb 生成?

ios - NSString localizedCompare : inconsistent results given longer strings

python - 检查字符串是否有效 MySQL UTF8?

c++ - Qt/C++ 如何在发出信号时等待一个槽

c++ - 列出/设置使 & C++ 搜索头文件的目录

java - 如何将 XML 输出保存为 PDF

python - BeautifulSoup 给了我 unicode+html 符号,而不是直接的 unicode。这是错误还是误解?