IMultiLanguage2 *mlang; DetectEncodingInfo info = {0}; MIMECPINFO codepageinfo; int length = 0, cnt = 1; String codepagestr; // String Datatype is my class unsigned int len =1;if(buffer.GetString()) length = buffer.GetLength();HRESULT hr = S_OK; SUCCEEDED(CoInitialize(NULL)); // init COMhr = CoCreateInstance(CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER, IID_IMultiLanguage2,(void **)&mlang);hr = mlang->DetectInputCodepage(0,0, (wyChar *)buffer.GetString(), &length, &info, &cnt);if(SUCCEEDED(hr)) { hr = mlang->GetCodePageInfo(info.nCodePage, info.nLangID, &codepageinfo); if(SUCCEEDED(hr)) codepage.SetAs(codepageinfo.wszDescription); }mlang->Release(); CoUninitialize();
需要判断文件流的前三个字节来判断编码。 或者使用 StreamReader sr = new StreamReader("filepath", true/*detectEncodingFromByteOrderMarks*/); 通常,当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字 符集的哪种编码保存的。软件有几种途径来决定文本的字符集和编码, 最标准的途径是检测文本最开头的几个字节,楼主可以以不同编码保存后研究一下各种格式看看.比如
开头字节 Charset/encoding EF BB BF UTF-8 FE FF UTF-16/UCS-2, little endian FF FE UTF-16/UCS-2, big endian FF FE 00 00 UTF-32/UCS-4, little endian. 00 00 FE FF UTF-32/UCS-4, big-endian.
Unicode: 前两个字节为FFFE;
Unicode big endian: 前两字节为FEFF;
UTF-8: 前两字节为EFBB;
Unicode: 前两个字节为FFFE;
Unicode big endian: 前两字节为FEFF;
UTF-8: 前两字节为EFBB;
==================================
这个不行,因为我的文件没有这些信息
Unicode: 前两个字节为FFFE;
Unicode big endian: 前两字节为FEFF;
UTF-8: 前两字节为EFBB;
==================================
这个不行,因为我的文件没有这些信息
文件没有这些信息=>ANSI: 无格式定义;
天气冷了,帮你的女朋友,老婆买件衣服吧:http://shop.paipai.com/312561265
DetectEncodingInfo info = {0};
MIMECPINFO codepageinfo;
int length = 0, cnt = 1;
String codepagestr; // String Datatype is my class
unsigned int len =1;if(buffer.GetString())
length = buffer.GetLength();HRESULT hr = S_OK;
SUCCEEDED(CoInitialize(NULL)); // init COMhr = CoCreateInstance(CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER, IID_IMultiLanguage2,(void **)&mlang);hr = mlang->DetectInputCodepage(0,0, (wyChar *)buffer.GetString(), &length, &info, &cnt);if(SUCCEEDED(hr))
{
hr = mlang->GetCodePageInfo(info.nCodePage, info.nLangID, &codepageinfo);
if(SUCCEEDED(hr))
codepage.SetAs(codepageinfo.wszDescription);
}mlang->Release();
CoUninitialize();
或者使用
StreamReader sr = new StreamReader("filepath", true/*detectEncodingFromByteOrderMarks*/);
通常,当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字
符集的哪种编码保存的。软件有几种途径来决定文本的字符集和编码,
最标准的途径是检测文本最开头的几个字节,楼主可以以不同编码保存后研究一下各种格式看看.比如
开头字节 Charset/encoding
EF BB BF UTF-8
FE FF UTF-16/UCS-2, little endian
FF FE UTF-16/UCS-2, big endian
FF FE 00 00 UTF-32/UCS-4, little endian.
00 00 FE FF UTF-32/UCS-4, big-endian.
如果字数增加变成"联通联通",由于字数多了,重码的机会更少,就不会发生"误认". 我知道每种编码都有一定格式,根据某些算法基本可以确定字节流的编码.
http://my.donews.com/sawfish/
不知道楼主是不是这个意思?
中IO流 字符编码那一部分 应该是第7讲 emule 里可以下
================================
我可以告诉你,只有有足够字节作为样本分析,是可以知道编码的. "联通"问题,只是因为字节太少,所以才会误认为utf-8编码.
public BufferedFileReader(String fileName) {
this.fileName = fileName;
byte[] head2 = new byte[2];
head2[0] = 0;
head2[1] = 0;
try {
InputStream in = new FileInputStream(fileName);
int bytes = 0;
try {
bytes = in.read(head2);
} catch (IOException ioE) {
}
if (bytes < 2) {
in.close();
bufReader = new BufferedReader(new InputStreamReader(
new FileInputStream(fileName)));
needCheckCharset = false;
} else {
try {
if (head2[0] == (byte)0xEF && head2[1] == (byte)0xBB) {
bufReader = new BufferedReader(new InputStreamReader(
in, "UTF-8"));
needCheckCharset = false;
} else if (head2[0] == (byte)0xFF && head2[1] == (byte)0xFE) {
bufReader = new BufferedReader(new InputStreamReader(
in, "UTF-16LE"));
needCheckCharset = false;
} else if (head2[0] == (byte)0xFE && head2[1] == (byte)0xFF) {
bufReader = new BufferedReader(new InputStreamReader(
in, "UTF-16BE"));
needCheckCharset = false;
} else {
in.close();
bufReader = new BufferedReader(new InputStreamReader(
new FileInputStream(fileName)));
needCheckCharset = true;
}
} catch (UnsupportedEncodingException ueE) {
ueE.printStackTrace();
}
}
} catch (FileNotFoundException fnfE) {
fnfE.printStackTrace();
} catch (IOException ioE) {
ioE.printStackTrace();
}
}
是要说一下的:1.现实往往是残酷的,你不可能永远有足够的样本空间
2.足够长的字符串与样本空间不一样,有足够长的也是不一定的,比如重复一万次的“联通”
3.“联通”不是个例,UTF-8的“汉汉”你用GB2312来解释看看你就知道了
4.如果一种文字是用一种你不知道的编码写的,恰恰你知道的一种编码又
解释的通,难道就是你知道的那种编码么?
5.编码的问题本来就没有那么简单,俺至少也在上面耗了好多年的时间了,你
能知道的方法永远是尝试的方法,不可能没有一点的错误
6.如果给我一个支点和一个足够长的杠杆,我也可以支起地球我不会再看这篇帖子,谢谢!