UTF-8文件头的问题(转)
在读写有关UTF-8格式的文件时,特别是如UTF-8格式的txt文件时,经常会遇到由于UTF-8的文件头造成的乱码问题。最近又碰到了,写下来记录一下处理方式吧,有更好的方法,欢迎各位留言交流。
所有采用UTF-8格式编码的文件的文件头三个字节用16进制表示是EFBBBF,因此在读取UTF-8格式文件的时候,需要去掉这个文件头。而当你并不了解读取的文件是GBK格式还是UTF-8格式时,你就不得不通过这个文件头来判断了。具体可以按照如下方式判断:
1、从文件流中读取前三个字节到一个byte[3]数组中;
2、通过Integer.toHexString(byte[0] & 0xFF),将byte[3]数组中的三个byte分别转换成16进制的字符表示;
3、根据对三个byte进行转换后得到的字符串,与UTF-8格式头EFBBBF进行比较即可知道是否UTF-8格式。
读UTF-8格式文件的时候,需要注意文件头,而在输出UTF-8文件的时候,同样也要注意这个文件头,否则你输出的文件,在使用记事本打开时,会出现乱码。为了将EFBBBF作为文件头输出,可以如下操作:
1、分别得到EF、BB、BF三个byte,比如得到EF,可以这样
byte b0 = Byte.decode("0xE").byteValue(); //得到16进制E的byte值
b0 = (byte)(b0 << 4); //将16进制E的byte值左移4为
byte b1 = Byte.decode("0xF").byteValue(); //得到16进制F的byte值
byte ef = (b0 | b1); //将左移4位后的E与F进行或操作
2、将得到的EF、BB、BF按照顺序作为UTF-8文件的第一、二、三个字节输出到文件。
我做过实验,用C语言读一个utf-8的txt文件,用二进制的方式读入时,在调试下就可以看到utf-8的文件头,即文件读进来的前三个字节都不是文件的内容,而是utf-8的标志。而我在windows下新建的一个txt文档,windows下默认是gbk的,所以用c去读的时,没有发现有前三个字节是标志编码格式的,而第一个字节就是txt的文件内容。