将没有BOM xml文件的UTF-8转换为ISO 8859-1

时间:2011-06-23 19:26:39

标签: xml visual-c++ utf-8 iso-8859-1

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

  3. 我会自由地承认,我自己并不完全清楚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却不是这样。

    换句话说;如果您坚持使用界面,那么您的最佳案例场景就是不可逆转的信息损失;最糟糕的情况是crashage和burnage。

    我的观点是:不要欺骗破坏的界面,永远不要使用UTF-8。