【问题标题】:UTF8 Beginning of File characters are breaking serializer & readersUTF8 文件开头字符正在破坏序列化程序和阅读器
【发布时间】:2010-12-18 22:07:23
【问题描述】:

好的,我正在尝试使用 UTF8 文本文件。我一直在与编写器为 UTF8 插入的 BOM 字符作斗争,这会炸毁几乎我需要用来读取文件的任何东西,包括序列化程序和其他文本阅读器。

我得到前六字节的数据:

0xEF
0xBB
0xBF
0xEF
0xBB
0xBF

(现在我正在看它,我意识到那里有两个字符。那是 UTF8 BOM 标记吗?我是双重编码吗)?

注意序列化器编码为 UTF8,然后内存流得到一个字符串为 UTF8,然后我用 UTF8 将字符串写入文件......似乎有很多冗余。想法?

//I'm storing this xml result to a database field. (this one includes the BOF chars)
using (MemoryStream ms = new MemoryStream())
{
    Utility.SerializeXml(ms, root);
    xml = Encoding.UTF8.GetString(ms.ToArray());

}


//later on, I would take that xml and then write it out to a file like this: 
File.WriteAllText(path, xml, Encoding.UTF8);



public static void SerializeXml(Stream output, object data)
{
    XmlSerializer xs = new XmlSerializer(data.GetType());
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.IndentChars = "\t";
    settings.Encoding = Encoding.UTF8;
    XmlWriter writer = XmlTextWriter.Create(output, settings);
    xs.Serialize(writer, data);
    writer.Flush();
    writer.Close();
}

【问题讨论】:

    标签: c# unicode utf-8 xml-serialization


    【解决方案1】:

    是的,这是两个 BOM。您编码为 UTF-8 两次,每次都添加一个伪 BOM,因为非常不幸的事实是:

    Encoding.UTF8
    

    的意思是“UTF-8 带有一个毫无意义的、毫无意义的 U+FEFF 粘在前面来搞砸你的应用程序”。尝试使用

    new UTF8Encoding(false)
    

    应该是give you a less sucky version

    【讨论】:

    • 完美!这回答了我的问题。我能够在没有 BOM 的情况下编写文件。我用新的UTF8Encoding(false) 替换了所有使用Encoding.UTF8 的位置。
    【解决方案2】:

    是的,这是一个 BOM。

    是的,一些较旧的 JDK 存在导致 UTF-8 BOM 数据崩溃的错误。其中两个甚至会混淆现代版本的 Java。

    我使用的解决方案是在前面粘贴一个推回流并将其过滤掉。

    或者使用更现代的 Java 版本。

    【讨论】:

      【解决方案3】:

      字节序列0xEF 0xBB 0xBF是U+FEFF的UTF-8编码,即Unicode BOM(字节序标记)。在UTF-8 中是不必要的,但在 UTF-16 或 UTF-32 中至关重要。

      你有两次相同的序列。

      处理它们的唯一好处是忽略和/或删除它们。

      【讨论】:

        猜你喜欢
        • 2018-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多