posts - 115, comments - 1535, trackbacks - 85, articles - 9
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

Question

在简体中文系统中,我们有时候需要打开一个保存在磁盘上的纯文本文件,例如txt,但却不知道其保存编码,该怎么办呢?

如果文本只需要在Windows上显示,那就很幸运了,因为无论是GB2312还是UTF-8编码的string都能够正确显示。但如果需要输出到ASP.NET页面上就不是那么简单了,因为如果页面编码为UTF-8但纯文本文件导入的string是GB2312,那就会导致乱码,反之亦然。因此,我们需要一种方法自动识别磁盘上的纯文本文件到底是么编码的。

Answer

StreamReader其实是有编码自动检测功能,不过因为它仅仅检测前3个字节,所以只能UTF-8、Little-Endian Unicode、Big-Endian Unicode之前作出选择,如果上述3个都不匹配,就选择用户提供的编码。因此,我们可以提供GB2312编码给StreamReader,让它在GB2312和UTF-8之前自动作出选择。

using (StreamReader reader = new StreamReader(path, Encoding.Default)
{
  string line;
  while ((line = reader.ReadLine()) != null)
  {
    FileTextBox.InnerHtml += Server.HtmlEncode(line) + "\r\n";
  }
  FileEncodingNameLabel.Text = reader.CurrentEncoding.EncodingName;
}

上述代码使用Encoding.Default初始化StreamReader,Encoding.Default指的是系统的默认ANSI编码,在简体中文系统中就是GB2312。这样写能够让代码保持有一定的兼容性,例如在繁体中文系统就变成了自动在Big5和UTF-8之间做出选择。之后的代码就是用StreamReader逐行读取文件内容并放到FileTextBox中,最后通过StreamReader的CurrentEncoding属性获取编码名称并显示在FileEncodingNameLabel中。

最后,如果你觉得本系列的文章对你有价值,可以考虑订阅Cat in dotNET,可选的方式包括通过Feed订阅(http://feeds.feedburner.com/CatChen/dotNET)和通过Email订阅(http://www.feedburner.com/fb/a/emailverifySubmit?feedId=573799)。

Feedback

#1楼    回复  引用    

2007-03-23 10:10 by test [未注册用户]
楼主自己有测过吗??
好像没什么用把? 偶不管把文件改成默认也好 utf-8嗯好,出来的都是 gb2312 ,格式是utf-8时 也是乱码的

#2楼    回复  引用  查看    

2007-03-23 13:25 by 随风流月      
网上以前还有见过识别5-6种编码的,是一个一个字节识别的,不记得了。
楼主这种方法只适用于含有 Unicode BOM 的。
Thank you all the same.

#3楼 [楼主]   回复  引用  查看    

2007-03-23 15:55 by Cat Chen      
@test
代码是直接从我的项目中拿过来的,至少在服务器上用notepad保存时选择保存为ANSI和Unicode的纯文本文件都能自动识别。

#4楼 [楼主]   回复  引用  查看    

2007-03-23 15:57 by Cat Chen      
@随风流月
通过调用dll,还可以好像IE那样根据统计学自动判断一个string的编码,并且不是返回一个结果而是返回几个高匹配度的结果,有关的文章可以在CodeProject找到。

#5楼    回复  引用  查看    

2007-04-10 11:57 by 海丰      
关于编码识别,可以看看这个从mozilla移植过来的东西

.NET自动字符编码识别程序库 NChardet
http://www.cnblogs.com/hhh/archive/2007/01/27/632251.html

#6楼    回复  引用    

2007-04-13 16:42 by billy0311 [未注册用户]
如果一个文本文件有30兆,需要分页显示,每次加载一部分数据,也可以这样读吗?
billymail@126.com

#7楼 [楼主]   回复  引用  查看    

2007-04-13 20:45 by Cat Chen      
@billy0311
这个和我介绍的内容无关吧,直接利用Stream的特性定位到你要读取的位置就行了。

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-03-22 14:10 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: