【问题标题】:Getting Special character while creating a file创建文件时获取特殊字符
【发布时间】:2018-04-05 07:54:28
【问题描述】:

我正在将文本写入文件,但在开头附加了特殊字符。任何人都可以指导它发生的原因以及我们如何避免它。

 using (FileStream fs = new FileStream(FILE_NAME, FileMode.CreateNew))
            {
                using (BinaryWriter w = new BinaryWriter(fs))
                {
                    w.Write(@"
COMMENT: OnDemand Generic Index File Format
COMMENT: This file has been generated by DOC Application
COMMENT: date");
                 }
             }

当我打开这个文件时,我会在开头得到特殊字符:

COMMENT: OnDemand Generic Index File Format COMMENT: 这个文件有 由 DOC 应用程序生成

评论:日期

【问题讨论】:

  • 出于兴趣,为什么二进制编写器不是文本编写器?
  • 必须尝试删除@(" 和 COMMENT 之间的空格:
  • 您发布的代码有不同的输出。前导字符是v = 0x76 = 118,这是写入的字符串的长度。这是BinaryWriter 的行为。 (并且在第二条评论之前还有enter。) Linux 的结果可能不同(或者仅使用LF,而不是CR+LF
  • 为避免这种情况 - 不要使用 BinaryWriter。它不适用于您尝试做的事情。请改用StreamWriter

标签: c# .net filestream streamwriter


【解决方案1】:

BinaryWriter 用于在与BinaryReader 配对时写入二进制文件 - 它为简单序列化程序中所需的一系列常见类型实现了一个非常简单的协议 - 例如字符串是长度前缀。您在此处看到的 Â 是:长度前缀。

基本上,不要使用BinaryWriter 来编写文本文件。要么使用File.WriteAllText(用于单个字符串),要么使用File.CreateText,这将为您提供TextWriter(特别是StreamWriter)。

所以:

File.WriteAllText(FILE_NAME, @"
COMMENT: OnDemand Generic Index File Format
COMMENT: This file has been generated by DOC Application
COMMENT: date");

或:

using(var file = File.CreateText(FILE_NAME))
{
    file.Write(...); // etc
}

【讨论】:

    【解决方案2】:

    这是一个编码问题,它曾经发生在我的所有文件中。玩了一会儿,这里是最简单的方法,首先获取具有显式编码的字节,然后 BinaryWriter.Write 就不需要猜错编码了:

    byte[] mybytes = System.Text.Encoding.ASCII.GetBytes(@"
    COMMENT: OnDemand Generic Index File Format
    COMMENT: This file has been generated by DOC Application
    COMMENT: date");
    
    using (FileStream fs = new FileStream(@"C:\temp\2.txt", FileMode.CreateNew))
    {
        using (BinaryWriter w = new BinaryWriter(fs))
        {
            w.Write(mybytes);
        }
    }
    

    【讨论】:

    • 不是编码问题。除非您指定不同的编码,否则 TextWriter 和派生类默认使用 UTF8。 代码是一个等待发生的错误。如果您输入 7 位 ASCII 范围之外的任何字符,您最多会得到不正确的字符。最坏的情况,无法映射的字符会被?替换,你会丢失数据
    • 顺便说一句,编码没什么好猜的。 .NET 和 Windows 通常使用 Unicode,特别是 UTF16。您转换为 ASCII 的字符串是 UTF16 字符串。
    • 不要粗鲁,但是这些对 OP 的问题有帮助吗?
    • 是的。不要使用 BinaryWriter。不要使用此代码。阅读 Marc Gravell 的回答以了解您做错了什么。而不是修复(不存在的)问题,您添加了一个
    猜你喜欢
    • 2011-08-31
    • 2017-10-29
    • 1970-01-01
    • 2019-06-14
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多