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的文件内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值