编程疑问:你要读取一个文本文件,但是怎么知道它是那种编码的?
编码格式有很多,ANSI、Unicode、utf-8、gb2312等等的。但是不同的编码之间有些差别吧,所以我想怎么解决读取文本文件的编码检测的问题。也就是说读取文件的编...
编码格式有很多,ANSI、Unicode、utf-8、gb2312等等的。
但是不同的编码之间有些差别吧,所以我想怎么解决读取文本文件的编码检测的问题。
也就是说读取文件的编码格式,然后就可以正确处理这个文本文件了。
讨论有赏! 展开
但是不同的编码之间有些差别吧,所以我想怎么解决读取文本文件的编码检测的问题。
也就是说读取文件的编码格式,然后就可以正确处理这个文本文件了。
讨论有赏! 展开
2个回答
展开全部
其实没有哪个可以100%确定编码的,包括JAVA的类也一样。
TEXT的存储不标识编码,那么,如何确定呢,其实一个GBK或者UNICODE的文本文件,就认为它是ANSI也是有道理的:里面放着不可打印字符 这个也行啊。
所谓的识别,其实就是识别可打印字符。
ANSI 是1BYTE存储,每个里面可打印字符都在128以内,如果你读取文本的前四个BYTE都是可打印字符,那么就是ANSI了。
同样,GBK是3位存储的,同样有着可打印特征,UNICODE是4位,也有着不同于GBK的特征码,注意这些其实就是可打印字符范围,3BYTE可以存储160w种符号,其中可打印符号的编码是有规则的,UNICODE同理。
也就是说,你读取文本的前4位(读取12位判定会更好),根据不同特征(每个BYTE的范围)就可以基本判定了。
具体的特征范围有完整的规范,可以在网上查到。
TEXT的存储不标识编码,那么,如何确定呢,其实一个GBK或者UNICODE的文本文件,就认为它是ANSI也是有道理的:里面放着不可打印字符 这个也行啊。
所谓的识别,其实就是识别可打印字符。
ANSI 是1BYTE存储,每个里面可打印字符都在128以内,如果你读取文本的前四个BYTE都是可打印字符,那么就是ANSI了。
同样,GBK是3位存储的,同样有着可打印特征,UNICODE是4位,也有着不同于GBK的特征码,注意这些其实就是可打印字符范围,3BYTE可以存储160w种符号,其中可打印符号的编码是有规则的,UNICODE同理。
也就是说,你读取文本的前4位(读取12位判定会更好),根据不同特征(每个BYTE的范围)就可以基本判定了。
具体的特征范围有完整的规范,可以在网上查到。
更多追问追答
追问
字符的编码的值好像都是正整数的吧?
追答
不全对。
以ANSI举例,一个BYTE,是256的范围,如果你说使用了符号,就是-128~127,那么就是整数范围,其实如果按照编码理解,无非就是二进制中八位的第一位为1,也可以认为是128~255,这个范围,也有对应的符号,通常叫做不可打印符号(其实是可以打印的,比如制表符)。所以,说正整数是不准确的。
GBK编码3个BYTE,它存储的汉字和其它可打印字符,必然有一个是超127(或者说负数)的,这,就是编码分辨的标识。
如:"D6D0B9FAC8CB0D0A";//内容是“中国人”三个字。“D6D0B9”这三个BYTE组成一个汉字,三个都是八位的第一位为1
展开全部
这个好像真不行,以前尝试过了,不过后来用一种比较土的办法,不能百分百正确,但是在我的那个应用场景下是没问题的。记得是拿各种字符互转以后比较他们的字符长度,如果字符长度相同则说明就是那种字符,这个你需要测试下,还有某些乱码后的长度 比正常编码 是固定要长或者短的 这个你可以写几个测试下就能找到规律!
追问
说的是有些真实道理,不过应该要了解各种编码格式吧,它们采用的编码字节可能会有些不同。
我就是不明白Java提供的类怎么就可以搞定这个编码问题所以才问这个。
谢谢。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询