`
顽石OK07
  • 浏览: 80952 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics