【问题标题】:What to do when file output turns Chinese?文件输出变成中文怎么办?
【发布时间】:2014-12-10 12:37:38
【问题描述】:

突然,我的输出文件决定变成中文。我尝试将一些随机的 ASCII 字符写入文件,但 C# 没有写入 ASCII,而是决定写入古代中文字母。它是想告诉我什么吗?

static void WriteToFile()
    {
        for (int i = 0; i < 100; i++)
        {
            int x = 0;
            x = rand.Next(0, 127);
            writer.Write((char)x);
        }
        writer.Close();
    }

【问题讨论】:

  • 静态 TextWriter writer = new StreamWriter("notepad");

标签: c# .net ascii


【解决方案1】:

当您编写没有 BOM 的文本文件时,您需要让读取文件的程序来猜测用于将文本转换为文件中字节的编码。如果您没有从“文件+打开”对话框中选择“编码”,记事本会使用启发式方法。底层的 winapi 调用是IsTextUnicode()。

使用随机字节值,就像您使用的那样,并且存在太多 ASCII 控制字符,因此不太可能选择 IS_TEXT_UNICODE_ASCII16(又名 utf-16)。是的,看起来像中文,两个字节选择字形。编写 BOM 可以让您摆脱麻烦,utf-8 是明智的选择。并且没有控制字符,大多数没有匹配的字形。从范围 32..127 中选择。谷歌“隐藏事实”的一个有趣的故事是关于早期版本的 IsTextUnicode() 摸索猜测。

【讨论】:

  • 感谢您对此主题的深入回答。真的很有帮助。
【解决方案2】:

我猜问题是您正在编写不可显示的值,例如 ASCII 中的前 32 个字符。将它们写为 UTF-8 without a BOM(这是 .NET 中 StreamWriter 的默认值)时,您可能会得到意想不到的结果。

这段代码产生了预期的结果:

StringWriter writer = new StringWriter();

Random rand = new Random();

for (int i = 0; i < 100; i++)
{
    int x = 0;
    x = rand.Next(32, 126);
    writer.Write((char)x);
}

writer.Close();

string s = writer.ToString();

File.WriteAllText(@"C:\temp\so2343.dat", s, Encoding.ASCII);

还要注意我对rand.Next 所做的代码更改,以仅获取可见字符。

【讨论】:

    【解决方案3】:

    您将原始字节写入文件,Notepad 将生成的文件视为 unicode。

    【讨论】:

      猜你喜欢
      • 2021-03-17
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      相关资源
      最近更新 更多