2

我有一个没有 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);
    // .........

此代码尚未经过测试。你认为这是最好的解决方案吗?欢迎任何想法或建议。先感谢您。

4

1 回答 1

1

正如我在评论中提到的那样:我认为这种思路需要向您提出一些问题,可以这么说:

  1. 你为什么首先进行这种转换?

  2. 你真的知道做什么WideCharToMultiByte()吗?

我会坦率地承认,我自己并不完全清楚到底是做什么WideCharToMultiByte()的;但我将继续假设它将一串宽字符转换为一串多字节字符。快速浏览一下文档,似乎它在一个新缓冲区中执行此操作,返回新字符串的长度。

这一切都很好,花花公子。问题是 UTF-8实际上不是宽字符编码;并且 ISO-8859-1不是多字节编码。UTF-8一种多字节编码;但在这种情况下,这对你并没有多大帮助。

我的建议; 那么,您是否阅读了字符编码;特别是关于 UTF-8(多字节)和 UTF-16(宽)之间的差异。

我还建议您为实际上接受 UTF-8 字符串的任何尝试找到不同的接口;因为任何需要 ISO-8859-1 字符串的接口,尤其是在处理 XML 时,都会让我觉得它是疯狂的遗留系统,几乎完全疯狂。

当然,您是否真的说明了总体上您正在努力实现的目标?可以给出更具体的建议。

编辑:如果我正确理解了您的难题,那么问题是您得到了一个格式正确且编码正确的 XML 文件,该文件可能包含 ASCII 范围之外的字符(U+0…U+127)。如果这是问题所在,以任何方式、形状或形式使用 ISO-8859-1 将使您成为未来所有头痛之母:

编码问题

如果文本文件可以包含ASCII 范围之外的某些字符,那么可以想象它可以包含ASCII 范围之外的任何字符。虽然 UTF-8 可以表示任何字符,但 ISO-8859-1 并非如此。

换句话说; 如果您坚持使用接口,那么您最好的情况是滥用编码是不可逆转的信息丢失;最坏的情况是崩溃和烧毁。

我的观点是:不要溺爱损坏的界面,永远不要使用 UTF-8。

于 2011-06-23T19:53:15.980 回答