文件输出变成中文时该怎么办?

时间:2014-12-10 12:37:38

标签: c# .net ascii

突然,我的输出文件决定成为中文。我试着给一个文件写一些随机的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();
    }

enter image description here

3 个答案:

答案 0 :(得分:1)

我想问题是你正在编写不可显示的值,比如ASCII中的前32个字符。将它们写为UTF-8 without a BOM(这是StreamWriter中.NET的默认设置)时,最终可能会出现意外结果。

此代码产生预期结果:

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所做的代码更改只能获取可见字符。

答案 1 :(得分:1)

当您编写没有BOM的文本文件时,将其留给读取文件的程序,以猜测用于将文本转换为文件中的字节的编码。如果您不从其“文件+打开”对话框中选择“编码”,则记事本将使用启发式扫描。潜在的winapi电话是IsTextUnicode()

使用随机字节值,就像你使用的那样,并且存在太多的ASCII控制字符时,不可能选择IS_TEXT_UNICODE_ASCII16(也就是utf-16)。是的,看起来像中文,两个字节选择字形。编写BOM可以让您远离麻烦,utf-8是理智的选择。并且没有控制字符,大多数都没有匹配的字形。选择范围32..127。谷歌“布什隐瞒事实”是因为有关IsTextUnicode()早期版本的一个有趣的故事引发了猜测。

答案 2 :(得分:0)

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