Xerces 3.2 XMLString::转码不适用于特殊字符

问题描述 投票:0回答:2

我有这个 xml 文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cmh>
<value atr="éè€ç"></value> 
</cmh>

这个简单的 C++ 程序使用 Xerces 3.2.3:

...
//const XMLCh* xmlch_OptionA = currentElement->getAttribute(XMLString::transcode("atr")); --> this one always works
char* a =  "éèç€";
//char* a =  XMLString::transcode(xmlch_OptionA); --> this one does not work with these characters
cout << sizeof(char) << " " << a << std::endl;
cout << std::hex << (unsigned int)(a[0] &0xFF) << " " << (unsigned int)(a[1] &0xFF) << " " << (unsigned int)(a[2] &0xFF) << " " << (unsigned int)(a[3] &0xFF) << std::endl;
...

输出:

1 éèç€
c3 a9 c3 a8

这个程序工作得很好,但是当我尝试使用 XMLString:transcode 从 XML 文件中检索 char* 时(请参阅注释行),我什么也没得到,而且我不明白为什么。我用 Iconv 作为转码器构建了这个 Xerces,它不是应该正确处理这些情况吗?或者也许有一种方法可以在不使用 transcode() 的情况下达到相同的结果?

输出错误:

1
0 0 0 0

注意:当然,如果我将“éè瀔替换为“abcd”之类的东西,它就可以工作。

c++ encoding xerces iconv transcode
2个回答
1
投票

问题来自我正在使用的 Docker 映像 (gcc:10.2)。 其上未安装 en_US.UTF-8 的区域设置。 所以,我安装了它并在程序的开头写道:

setlocale(LC_ALL, "en_US.UTF-8");

XMLString::transcode 现在工作得很好。


0
投票

您可以在 bashrc 脚本中导出所有这些语言环境变量

export LANG="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
export LC_NUMERIC="en_US.UTF-8"
export LC_TIME="en_US.UTF-8"
export LC_COLLATE="en_US.UTF-8"
export LC_MONETARY="en_US.UTF-8"
export LC_MESSAGES="en_US.UTF-8"
export LC_PAPER="en_US.UTF-8"
export LC_NAME="en_US.UTF-8"
export LC_ADDRESS="en_US.UTF-8"
export LC_TELEPHONE="en_US.UTF-8"
export LC_MEASUREMENT="en_US.UTF-8"
export LC_IDENTIFICATION="en_US.UTF-8"

运行 locale 命令检查所有这些变量是否正确导出。 XMLString::transcode 现在也接受特殊字符。

© www.soinside.com 2019 - 2024. All rights reserved.