文本编辑器(比如XP自带的记事本)在生成文本文件时,如果编码格式和系统默认的编码(中文系统下默认为GB2312)不一致时,会在txt文件开头部分添加特定的“编码字节序标识(Encoding Bit Order Madk,简写为BOM)”,类似PE格式的"MZ"文件头。这样它在读取时就可以根据这个BOM来确定该文本文件生成时所使用的Encoding。这个BOM我们用记事本等程序打开默认是看不到的,但是用stream按字节读取时是可以读到的。我的这个TxtFileEncoding类就是根据这个BOM“文件头”来确定txt文件生成时用到的编码的。
解决方式如下:
a.对中文文本进行编码,并写入文本文件:
FileStream write
=
File.Create(save.FileName);
//
生成文件流
Byte[] encodedBytes = new byte [rtxtContent.Text.Length * 2 ];
Encoding.GetEncoding( " gb2312 " ).GetBytes(rtxtContent.Text, 0 , rtxtContent.Text.Length, encodedBytes, 0 );
write.Write(encodedBytes, 0 , rtxtContent.Text.Length); // 写入文件
write.Flush(); // 清空缓冲区
write.Dispose(); // 销毁流
Byte[] encodedBytes = new byte [rtxtContent.Text.Length * 2 ];
Encoding.GetEncoding( " gb2312 " ).GetBytes(rtxtContent.Text, 0 , rtxtContent.Text.Length, encodedBytes, 0 );
write.Write(encodedBytes, 0 , rtxtContent.Text.Length); // 写入文件
write.Flush(); // 清空缓冲区
write.Dispose(); // 销毁流
b.对文本文件进行解码,并显示到文本框
1
StreamReader read
=
new
StreamReader(open.FileName, Encoding.GetEncoding(
"
gb2312
"
));
//
由文件路径生成流,汉字编码
2 rtxtContent.Text = read.ReadToEnd(); // 读取文件
另注:ISO-8859-1为拉丁字符编码方式
2 rtxtContent.Text = read.ReadToEnd(); // 读取文件