首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

UTF-8文件头的有关问题

2012-09-19 
UTF-8文件头的问题转载:http://hi.baidu.com/tianpaomian/blog/item/21c0fa0222b71c064bfb5136.html?在读

UTF-8文件头的问题

转载:http://hi.baidu.com/tianpaomian/blog/item/21c0fa0222b71c064bfb5136.html

?

在读写有关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文件的第一、二、三个字节输出到文件。

热点排行