有一段编码,如何测出它是属于那种charset 例如,一段编码为xzp4kabfqj3kzau90mj2bytj6380c如何测出它是gb2312、还是UTF-8、还是其它什么charset 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public class EncodingType{ public static System.Text.Encoding GetType(string FILE_NAME) { FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read); System.Text.Encoding r = GetType(fs); fs.Close(); return r; } public static System.Text.Encoding GetType(FileStream fs) { /*byte[] Unicode=new byte[]{0xFF,0xFE}; byte[] UnicodeBIG=new byte[]{0xFE,0xFF}; byte[] UTF8=new byte[]{0xEF,0xBB,0xBF};*/ BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default); byte[] ss = r.ReadBytes(3); r.Close(); //编码类型 Coding=编码类型.ASCII; if (ss[0] >= 0xEF) { if (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF) { return System.Text.Encoding.UTF8; } else if (ss[0] == 0xFE && ss[1] == 0xFF) { return System.Text.Encoding.BigEndianUnicode; } else if (ss[0] == 0xFF && ss[1] == 0xFE) { return System.Text.Encoding.Unicode; } else { return System.Text.Encoding.Default; } } else { return System.Text.Encoding.Default; } }} 3楼的肯定不对……LZ的问题是给一段特定编码的流,判断其所用编码你那代码是验证文件BOM头就算LZ也是要验证文件编码,也不能保证每个Unicode文件都有BOM头啊。LZ这个问题需要参考Unicode和GB2312对应的编码定义,多字节字符中,每个字节序列特定字节上可以出现的值是特定的,例如GB2312中如果头一个字节是0xA1,那后一个字节只能是0xA1到0xFE之间的值,而UTF-8中,如果发现一个字节是0xA1,那么它只能是一个多字节序列的第二个字节。话说这个问题并不是那么简单,如果是一个短语,那判断出错的几率很高php中有mb_stringencoding(或者类似)的一个函数,用于判断编码,也是经常出错的Ultraedit32有判断编码的功能,也是经常出错,LZ最好换个思路。 网上找到一段代码,但好像不是C#的,谁能将下列代码改成C#代码:1、判断是否是GB2312 bool isGBCode(const string& strIn) { unsigned char ch1; unsigned char ch2; if (strIn.size() >= 2) { ch1 = (unsigned char)strIn.at(0); ch2 = (unsigned char)strIn.at(1); if (ch1 >=176 && ch1 <=247 &&ch2 >=160 && ch2 <=254) return true; else return false; } else return false; } 2、判断是否是GBK编码 bool isGBKCode(const string& strIn) { unsigned char ch1; unsigned char ch2; if (strIn.size() >= 2) { ch1 = (unsigned char)strIn.at(0); ch2 = (unsigned char)strIn.at(1); if (ch1 >=129 && ch1 <=254 &&ch2 >=64 && ch2 <=254) return true; else return false; } else return false; } 搜索引擎只查看Header,而Header中就指定了字符集 字符串绑定datagridview问题 在线等:为什么我在dataGridView里添加了2个Linkbutton后列的索引都变了??这是怎么回事?求指教?。 C#自定义子界 DataGridViewComboBoxColumn的问题 vs2008,考验各路高手的时候来了。。。 郁闷,散分问题,string的indexof函数的用法? 关于设定时间,自动取数的问题 智能客户端离线操作的问题。请教大家! 请问一下现在C#里面哪个较吃香啊? notifyFilter 小问题 再没人答真要去跳闽江了 DataGrid重载问题 怎么样才能在一个客户端里同时连接两台服务器上的REMOTING服务?
public static System.Text.Encoding GetType(string FILE_NAME)
{
FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);
System.Text.Encoding r = GetType(fs);
fs.Close();
return r;
}
public static System.Text.Encoding GetType(FileStream fs)
{
/*byte[] Unicode=new byte[]{0xFF,0xFE};
byte[] UnicodeBIG=new byte[]{0xFE,0xFF};
byte[] UTF8=new byte[]{0xEF,0xBB,0xBF};*/ BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default);
byte[] ss = r.ReadBytes(3);
r.Close();
//编码类型 Coding=编码类型.ASCII;
if (ss[0] >= 0xEF)
{
if (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF)
{
return System.Text.Encoding.UTF8;
}
else if (ss[0] == 0xFE && ss[1] == 0xFF)
{
return System.Text.Encoding.BigEndianUnicode;
}
else if (ss[0] == 0xFF && ss[1] == 0xFE)
{
return System.Text.Encoding.Unicode;
}
else
{
return System.Text.Encoding.Default;
}
}
else
{
return System.Text.Encoding.Default;
}
}
}
你那代码是验证文件BOM头就算LZ也是要验证文件编码,也不能保证每个Unicode文件都有BOM头啊。LZ这个问题需要参考Unicode和GB2312对应的编码定义,多字节字符中,每个字节序列特定字节上可以出现的值是特定的,例如GB2312中如果头一个字节是0xA1,那后一个字节只能是0xA1到0xFE之间的值,而UTF-8中,如果发现一个字节是0xA1,那么它只能是一个多字节序列的第二个字节。话说这个问题并不是那么简单,如果是一个短语,那判断出错的几率很高php中有mb_stringencoding(或者类似)的一个函数,用于判断编码,也是经常出错的Ultraedit32有判断编码的功能,也是经常出错,LZ最好换个思路。
bool isGBCode(const string& strIn)
{
unsigned char ch1;
unsigned char ch2; if (strIn.size() >= 2)
{
ch1 = (unsigned char)strIn.at(0);
ch2 = (unsigned char)strIn.at(1);
if (ch1 >=176 && ch1 <=247 &&ch2 >=160 && ch2 <=254)
return true;
else return false;
}
else return false;
}
2、判断是否是GBK编码
bool isGBKCode(const string& strIn)
{
unsigned char ch1;
unsigned char ch2; if (strIn.size() >= 2)
{
ch1 = (unsigned char)strIn.at(0);
ch2 = (unsigned char)strIn.at(1);
if (ch1 >=129 && ch1 <=254 &&ch2 >=64 && ch2 <=254)
return true;
else return false;
}
else return false;
}