【问题标题】:Convert a UTF-8 without BOM xml file into ISO 8859-1将没有 BOM xml 文件的 UTF-8 转换为 ISO 8859-1
【发布时间】: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


【解决方案1】:

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

  1. 您为什么首先进行此转换?

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

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

这一切都很好,花花公子。问题是 UTF-8 实际上是 not 宽字符编码; 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。

【讨论】:

  • 我认为我的问题更简单:如果在没有 BOM 的情况下编码为 UTF-8 的 Simulink 生成的 xml 文件可能包含特殊字符,然后 IXMLDocument 无法加载它。新版本的 Simulink 现在建议使用 ISO 8859-1 生成并正确加载的 xml 文件。我现在的问题是如何加载我的旧 xml 文件(没有 BOM 的 utf8)并通过将它们转换为 iso 8859-1 来加载它们。感谢您的回答..我不是 XML 和编码方面的专家..
  • @Jawhar:重申一下:永远不要使用 UTF-8。这一点我怎么强调都不过分。由于过去基于错误的假设做出了一些糟糕的选择(例如存储空间和数据传输的成本),整个字符编码问题一团糟,但是 Unicode 和 UTF -8 尤其是在这可怕的可怕混乱中,是一盏闪亮的希望灯塔。问题是您使用的接口已损坏,您需要学习如何识别和处理正确的接口和用于 XML 处理的工具。 600.
猜你喜欢
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 2014-08-29
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多