本文用于记录编码和解码相关学习记录。

知识点0

很好的一个学习地址:https://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/index.html

 

知识点1

文本在计算机里面的最终形式是以二进制存储的,当程序来显示这些二进制的时候,程序就要知道这些二进制数据是什么意识,比如程序认为这些数据是以GBK编码的,那么这些数据就需要用GBK来解码:两个两个字节表示一个文字,那两个字节去GBK编码表找文字,找到之后显示给用户看。如果是UTF-8,那么程序就会取三个字节到UTF-8编码表里面找文字。

 

知识点2

java代码中(前提java文件使用utf-8编码):

1.String str = "你好啊";此时,str的中文是使用utf-8来编码的,str内部的byte数组的长度就位3*3=9。
2.byte[] b = xxx//存储的文字数据

String str = new String(b,"GBK")//这个时候的转换流程是:把b使用gbk编码进行解析,得到文字,然后把文字进行utf-8编码(为什么使用这个编码,和前提有关,java程序使用utf-8进行编码),最后把经过utf-8编码的结果存入str里面

 

知识点3

先考虑一个问题:使用代码到操作系统上面创建文件夹和读取文件夹时文件名的编码问题?

知识点3-1:读取文件名时,系统根据jdk的默认编码进行文件名解码

知识点3-2:使用System.out.println(System.getProperties().get("file.encoding"));获取jdk默认的编码,如果默认编码和代码设置的编码是一样,就不会出现乱码问题

知识点3-3:Java写文件时文件名编码和System.getProperty(“sun.jnu.encoding”)。sun.jnu.encoding 影响文件名的创建,而 file.encoding 则影响到文件内容。

知识点4

char在java里面的长度就是2个字节。

java里面有:内码(internal encoding)和外码(external encoding)。
内码是程序内部使用的字符编码,特别是某种语言实现其char或String类型在内存里用的内部编码;
外码是程序与外部交互时外部使用的字符编码。“外部”相对“内部”而言;不是char或String在内存里用的内部编码的地方都可以认为是“外部”。例如,外部可以是序列化之后的char或String,或者外部的文件、命令行参数之类的。

String.getBytes()是一个用于将String的内码转换为指定的外码的方法。无参数版使用平台的默认编码作为外码,有参数版使用参数指定的编码作为外码;将String的内容用外码编码好,结果放在一个新byte[]返回。