如何知道一个文件的编码? 请注意文件头没有任何编码信息的情况下如何知道文件的编码?我发现用记事本打开文件,记事本能自动识别文件的编码,不知道记事是如何做到的?? 请注意,文件头绝对没有编码的信息,那些说根据文件的头两个字节来判断的方法是行不通的.
既然记事本能认出来,我想一定有方法可以知道文件的编码,希望高人指点.
既然记事本能认出来,我想一定有方法可以知道文件的编码,希望高人指点.
解决方案 »
- 50分求一个简单问题!!java中如何对一个double变量在十位数四舍五入?
- getRemoteAddr得到的IP地址是网络字节吗?inetaddress.getAddress()呢?
- 请问 数据库中的数据如何在Java界面的JTable组件中显示出来???(在线等待回复)
- 谁解释一下重载equals(),hashcode()的例子
- 讨论:做数据库是好java还是PowerBuilder好。讨论者都有分
- 表达式问题:
- 问题,急,散分!!!
- 怎样把 44,234,434 转换成 数字 44234434 ?? 就是说去掉逗号(寻求最简单的方法)
- 很菜的问题
- 大家帮我出个主意吧。。
- (多线程问题)为什么这个程序的输出结果一定是这样的?
- java多线程问题,恳请各位高手帮忙。
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.如果给我一个支点和一个足够长的杠杆,我也可以支起地球我不会再看这篇帖子,谢谢!