【发布时间】:2011-09-21 12:29:44
【问题描述】:
我有一个没有 BOM 的 UTF-8 编码的 xml 文件。在十六进制编辑器中它给出:3c 3f 78 6d
我缓冲我的 xml 文件并在开头添加 BOM:
char* BufferEncoder = (char*)malloc(3);
memset(BufferEncoder, 0, size);
for(int i=0;i<3;i++) BufferEncoder[i] ^= 0xaa;
BufferEncoder[0]=(char)0xef;
BufferEncoder[1]=(char)0xbb;
BufferEncoder[2]=(char)0xbf;
// concatenate into a new Buffer containing old xml and the BOM
然后我尝试使用以下代码行将带有 BOM 的 UTF-8 转换为 ISO 8859-1:
int size = WideCharToMultiByte(28591 /*ISO-8859-1*/, 0, pBuffer, -1, NULL, 0, NULL, 0);
if (size>0)
{
char* pBuffer2 = (char*)malloc(size);
memset(pBuffer2, 0, sizeNew);
WideCharToMultiByte(28591, 0,pBuffer,-1, pBuffer2, size, NULL, 0);
// .........
此代码尚未经过测试。你认为这是最好的解决方案吗?欢迎任何想法或建议。提前谢谢你。
【问题讨论】:
-
我讨厌问这个问题,因为答案普遍很糟糕:为什么你觉得你必须从 UTF-8 转换文本?另外,如果 WideCharToMultiByte 做我认为的事情;你使用了错误的功能。 UTF-8 不是宽字符编码;并且 ISO-8859-1 不是多字节的。
-
感谢您的回答。我的 xml 文件是由另一个工具(TLC Simulink)生成的,我无法控制它。 IXMLDocument 的加载功能无法加载没有包含特殊字符的 BOM 的 xml UTF-8。因此,我必须将其转换为带有 BOM 的 UTF-8,然后再转换为 ISO 8859-1,否则它将无法工作。什么是那么正确的功能呢? :)4
-
如果是这样的话; IXMLDocument 已无法修复。使用不同的 XML 处理工具。如果您没有明确说明这一点;处理 XML 文档的正确方法是在没有 XML 声明的情况下说明编码并且不产生关于编码可能是什么的其他提示,将其视为没有 BOM 的 UTF-8。任何不同的工具都是Doing It Wrong™,需要回避和羞辱;如果时间和敏感度允许,也许会画出四等分。
标签: xml visual-c++ utf-8 iso-8859-1