1 字节流以及编码转换说明
String str = "中";
byte[] b_gbk =str.getBytes("GBK");
byte[] b_utf8 =str.getBytes("UTF-8");
String s_gbk = newString(b_gbk,"GBK");
String s_utf8 = newString(b_utf8,"UTF-8");
System.out.println(s_gbk);
System.out.println(s_utf8);
环境:Windows系统Eclipse,源码格式是GBK,为什么写明环境,主要还是跟系统显示有关
1.1详细剖析
第一行代码其实暗含:str是一个GBK编码的字符串,里面的byte数组存储的编码字符串是GBK编码的。
第二行代码getBytes是什么意思呢?就是告诉系统,你把str里面的字符串内容,转换成GBK编码然后存储到b_gbk,这就会涉及到GBK编码转换成UTF-8编码,如果理解不了,可以这样子想:中字在GBK里面的编码是这样子这样子,你看看中字在UTF-8的编码是什么,告诉我。
第四行代码后面有指定编码格式,就是告诉系统,我这个String类型存储的是GBK编码的字符串,系统在显示该字符串的时候,知道其编码格式,采用GBK来解码显示。
问题1:
java读取utf-8编码文件,出现中文乱码,最大可能的原因是什么?读取GBK编码文件,是正常的!
上面已经提到过String变量是有编码的格式要求的,默认情况下,读取文件的时候会根据系统的默认编码来读取,这种情况下,肯定就是乱码了,因为读取进去的就是,赋值给String就是GBK编码。
问题2:
utf-8带BOM的文件会出现?这个符号,这是什么情况?
原来BOM在文件中也是一种字符存在,因为没有对应的编码输出,所以只能够显示这种符号了。所以在应用中不要选择这种编码方式就可以了。
2 UTF-8或者GBK文本的读取
有了上面的基础,就可以读取文本了。构建一个UTF-8的中文文档
publicstaticvoidmethod()
{
try{
File file =newFile("d:fengyuzaitu.txt");
bytebuffer[] =newbyte[20];
FileInputStreamf ileinput =newFileInputStream(file);
fileinput.read(buffer);
Strings =newString(buffer,"UTF-8");
System.out.println(s);
fileinput.close();
}catch(IOException e) {
e.printStackTrace();
}
}
publicstaticvoidmethod1()
{
try{
FileInputStream fileinput =newFileInputStream("d:fengyuzaitu.txt");
InputStreamReader isr =newInputStreamReader(fileinput,"UTF-8");
BufferedReader br =newBufferedReader(isr);
Stringtest ="";
test = br.readLine();
System.out.println(test);
br.close();
}catch(IOException e) {
e.printStackTrace();
}
}
这里进行详细描述:
方法1:直接读取字节流,然后指定String的编码类型,也就是字节流当前的编码类型
方法2:指定读取文本采用的编码格式,返回的String实际上就是经过第一种方法的包装之后返回的。
温馨提示:读取sqlite数据库的时候,如果将GBK字节流存储进去,读取出来的时候采用getBytes,读取字节流,然后按照上面的方法进行转换。