如何知道某个文本文件用的是何种字符编码

aloneone 2011-03-22 08:28:23
由于读取文本文件时,老是碰到乱码问题,所以只好用以下方法来获取正确的文本,本来 Encoding.Default在Visual Studio2005就已正常运行,没想转到Visual Studio2008上来,就出问题了。
问题是这样的,
我事先将SQL代码存在一个文件中,需要时根据“FileName”指定的文件调出SQL代码,交给SQLCommnad执行。转到VS2008后,以前在VS2005中编辑并保存的文本文件可以照旧读取,可是在VS2008中新写的文本就无法正常读出,我将Encoding的所有编码都度了个遍,只有Encoding.UTF8可以比较正常地读取文本,但读出来的文本前面会出现个乱码——我在VS2008中开头是“Select……”,结果出来的是一个乱码+“elect".我用“记事本”打开在VS2008中创建的文本却可以正常显示,真不知道VS2008的文本编辑器用的是编码存储文本的。
所以,我想在程序中加入识别文本编码的功能来解决这个问题,(先识别出文本的编码方式,再根据识别出的文本编码方式采用相应的文本编码读取文件内容。)
private void button1_Click(object sender, EventArgs e)
{
String SQLCode;

Encoding defaultEncode = Encoding.UTF8;//.ASCII;//.Unicode;//.Default;
byte[] bytes = File.ReadAllBytes(FileName); //unicode.GetBytes(unicodeString);
char[] strChars = new char[defaultEncode.GetCharCount(bytes, 0, bytes.Length)];
defaultEncode.GetChars(bytes, 0, bytes.Length, strChars, 0);

SQLCode = defaultEncode.GetString(bytes);

richTextBox1.Text = SQLCode;
}
另外补充点其他情况供参考:
我直接用“记事本”写的内容,用这段代码可以正确地读取,在VS2008中用“添加-新建项-文本文件”建立的文件写同样的内容,运行程序就会把字符串的头一个字符变成乱码。

最好能给一段识别文本编码方式的代码,实在不行告诉我如何设定VS2008文本编辑器的编码方式也给分!
...全文
787 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
aloneone 2011-03-23
  • 打赏
  • 举报
回复
再提个新问题
三、为什么Encoding.UTF8可以正确读出(UTF8-无签名)的编码格式,却读不出(UTF8-带签名)编码格式的文本呢,不是说“不带签名,很多软件不认识,会读错”吗?
aloneone 2011-03-23
  • 打赏
  • 举报
回复
刚刚在网上看了别的资料确认,、(UTF8-带签名)格式比(UTF8-无签名)大文件头多了三个字符,
可是白天(单位上上不了互联网)在我做此猜想后,我曾用
defaultEncode.GetChars(bytes, 3, bytes.Length-3, strChars, 0);
结果是原文为“test"读出来的字符串为“t est" —— 在头字符后竟然多出了空格。搞不清是什么飞机。
aloneone 2011-03-23
  • 打赏
  • 举报
回复
问题解决了,
代码修改如下:
private void button1_Click(object sender, EventArgs e)
{
String SQLCode;
using (StreamReader sr = new StreamReader(文件名))
{
SQLCode = sr.ReadToEnd();
}
richTextBox1.Text = SQLCode;
}
可以正确读出文本
但我试了下这些代码
private void button1_Click(object sender, EventArgs e)
{
String SQLCode;

StreamReader sr = new StreamReader(文件名))

Encoding defaultEncode = sr.CurrentEncoding;// UTF8;//.ASCII;//.Unicode;
byte[] bytes = File.ReadAllBytes(FileName); //unicode.GetBytes(unicodeString);
char[] strChars = new char[defaultEncode.GetCharCount(bytes, 0, bytes.Length)];
defaultEncode.GetChars(bytes, 0, bytes.Length, strChars, 0);

SQLCode = defaultEncode.GetString(bytes);
richTextBox1.Text = SQLCode;
}

还是无法正确读出文本,第个字符总是变成乱码。
后来写来段代码,
把VS2005下建立的文本文件与VS2008下建立的文本文件(文本内容完全一致)读到字节数组中比较,发现VS2005中建立的文本文件比VS2008中建立的文本文件要小,VS2008中建立的文本比VS2005建立的文本前面要
多出3个字节。
两个文本文件用Encoding.UTF8之外的编码读出来的是乱码,用Encoding.UTF8读VS2008中建立的文本,头一个字符无论是英文还中文都会变成乱码。后来终于找到文件菜单下有一个“高级保存选项”,其默认的编码选项是(UTF8 - 带签名),将其改为(UTF8-无签名)再重新保存原来的文本,就不会出现乱码了。我看下VS2005的相应设置,默认编码选项也是(UTF8 - 带签名),但从字节数组观察到的内容,我想VS2005对于其建立的文本文件应该采用的是(UTF8-无签名)编码。
看来是(UTF8 - 带签名)这种编码格式造成的混乱。
虽然乱码的问题解决了(两种方法):一个用StreamReader.ReadToEnd()方法读取,一个是修改文本的编码选项。
但还有两个问题没解决:
一、如何动态识别出所读文件中的文本是何种编码格式的这个根本问题还是没有解决。
StreamReader将编码识别封装起来了,可是如何直接根据字节数组中的内容判断编码格式呢?
二、(UTF8-带签名)格式比(UTF8-无签名)格式多了什么如何读取或剔除这些多余信息呢?

请高手能够指点
子夜__ 2011-03-22
  • 打赏
  • 举报
回复
yalan 2011-03-22
  • 打赏
  • 举报
回复
判断文本文件的编码:
StreamReader sr=new StreamReader(@ "c:\1.txt ");
sr.CurrentEncoding //返回编码

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧