java写⼊⽂件编码格式为ansi_Java⽂件读取写⼊的编码问题关于编码解码的知识背景:
内 编码 --->> ⽬
容 <
编码解码跟翻译语⾔⼀样。内容是本质的东西,⽆论怎么编码,它所表达的内容不能变。
⽽⽆论怎么编码解码,表现形式都是字节数组,它的值会随着编码解码⽅式的不同⽽不同。
编码解码要做的,就是对这些byte数组进⾏操作,将它还原成我们需要的内容。
对于⼀段汉字的编码解码,汉字本⾝就是内容⽂件,我们需要将他们⽤数字的形式表⽰,即编码为对应的⼆进制串(⽬标)
常见的字符集:
ANSI :ASCII字符集,以及由此派⽣并兼容的字符集,如:GB2312(汉字⽀持,GB是“国标”的缩写),对GB2312向下兼容的GBK(其中能表达的汉字数量⽐GB2312多),正式的名称为MBCS(Multi-Byte Chactacter System,多字节字符系统),通常也称为ANSI字符集。
UNICODE: 由于每种语⾔都制定了⾃⼰的字符集,导致最后存在的各种字符集实在太多,在国际交流中要经常转换字符集⾮常不便。因此,产⽣了Unicode字符集,它固定使⽤16 bits(两个字节)来表⽰⼀个字符,共可以表⽰65536个字符。标准的Unicode称为UTF-
16(UTF:UCS Transformation Format ,每两个字节作为⼀个编码单元,编码效率⾼。这让能够⽤⼀个字节存放的ASCII字符浪费了⼀个字节,不适于⽹络传输,多⽤于本地的编码)。后来为了双字节的Unicode能够在现存的处理单字节的系统上正确传输,出现了UTF-8(变长编码,有更好的鲁棒性:UTF16顺序编码,如果中间丢失⼀个bit位,将全盘皆输,但UTF8的编码⽅式中,每个单元都有⼀个特定⼏个bit 位的头,这让它能抵抗这种情况),使⽤类似MBCS的⽅式对Unicode进⾏编码。(Unicode字符集有多种编码形式)
-----------------------************正⽂************-----------------------
Java中读取⽂件的解码
⽂件以字节的形式存储在磁盘,这些数据实际上是⽂件的内容通过某种字符集编码后的结果,⽽我们读取⽂件后对⽂件的处理就是对这些数据的解码。
按照java IO 的框架,Java读取⽂件的⽅式总体可以分为两类:按字节读取和按字符读取。下⾯依次分析。
unicode文件格式
按字节读取
按字节读取的层次结构是各种stream 。可以使⽤ad()⽅法来读取字节。需要的话,可以将字节数组转换成String字符串。
⽽编码也就隐式发⽣在由字节数组转换到字符串数组的过程中。
String str = newString(byteArray);
参见String构造函数的doc, 如上的转换实际上使⽤的是系统的默认字符集。如果需要制定字符集解码,可以使⽤
(byte[] bytes,Charsetcharset)构造函数。
只要能⽤⽂件的编码字符集进⾏解码,就不会出现乱码问题。
以下为实践代码。我存储了a.txt到我的⽤户⽬录下。内容为: biaobiaoqi编码问题
packagebiaobiaoqi.thinkingInJava;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.IOException;
publicclassTest {
publicstaticvoidmain(String[] args){
try{
FileInputStream in =newFileInputStream("/home/");
byte[] bytes =newbyte[100];
while((in.read(bytes)) != -1);
in.close();
String strGB2312 =newString(bytes,"GB2312");
String strGBK =newString(bytes,"GBK");
String strUTF8 =newString(bytes,"UTF-8");
String strUTF16 =newString(bytes,"UTF-16");
System.out.println("strGB2312: "+strGB2312);
System.out.println("strGBK: "+strGBK);
System.out.println("strUTF8: "+strUTF8);
System.out.println("strUTF16: "+strUTF16);
}catch(FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch(IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
分别⽤GB2312 ,GBK ,UTF8, UTF16 并⽤system.out.println显⽰,结果如下:
strGB2312: biaobiaoqi编码问题
strGBK: biaobiaoqi编码问题
strUTF8: biaobiaoqi��������
strUTF16: 扩慯扩慯煩
可以推断,a.txt的⽂本⽂件编码为ANSI,GBK向下兼容GB2312,所以两者都能显⽰。⽽UTF则不是那么顺利了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论