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