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-8BOM的文件会出现?这个符号,这是什么情况?

    原来BOM在文件中也是一种字符存在,因为没有对应的编码输出,所以只能够显示这种符号了。所以在应用中不要选择这种编码方式就可以了。

 

2 UTF-8或者GBK文本的读取

有了上面的基础,就可以读取文本了。构建一个UTF-8的中文文档

    public static void method()

    {

        try {

            File  file = new File("d:fengyuzaitu.txt");

            byte buffer[] = newbyte[20];

            FileInputStreamf ileinput = new FileInputStream(file);

            fileinput.read(buffer);

            Strings = new String(buffer, "UTF-8");    

            System.out.println(s);

            fileinput.close();         

        }catch(IOException e) {

            e.printStackTrace();

        }

    }

   

    public static void method1()

    {

        try {

            FileInputStream fileinput = new FileInputStream("d:fengyuzaitu.txt");

            InputStreamReader isr = new InputStreamReader(fileinput, "UTF-8");

            BufferedReader br = new BufferedReader(isr);

            Stringtest = "";

            test = br.readLine();

            System.out.println(test);  

            br.close();

        }catch(IOException e) {

            e.printStackTrace();

        }

    }

 

这里进行详细描述:

方法1:直接读取字节流,然后指定String的编码类型,也就是字节流当前的编码类型

方法2:指定读取文本采用的编码格式,返回的String实际上就是经过第一种方法的包装之后返回的。

 

温馨提示:读取sqlite数据库的时候,如果将GBK字节流存储进去,读取出来的时候采用getBytes,读取字节流,然后按照上面的方法进行转换。