java编码问题的简单总结

1.java中存储字符串都是用unicode(utf-16le).
2.unicode只是一种编码方式,简单地说,unicode只是规定了从数字到对应的字符的一个映射,但怎么表示这个数字,就有多种方法了.比如,“汉字”对应的数字是0x6c49和0x5b57,而编码的程序数据是:
BYTE data_utf8[] = {0xE6, 0xB1, 0x89, 0xE5, 0xAD, 0x97}; // UTF-8编码
WORD data_utf16[] = {0x6c49, 0x5b57}; // UTF-16编码
DWORD data_utf32[] = {0x6c49, 0x5b57}; // UTF-32编码
  这里用BYTE、WORD、DWORD分别表示无符号8位整数,无符号16位整数和无符号32位整数。UTF-8、UTF-16、UTF-32分别以BYTE、WORD、DWORD作为编码单位。“汉字”的UTF-8编码需要6个字节。“汉字”的UTF-16编码需要两个WORD,大小是4个字节。“汉字”的UTF-32编码需要两个DWORD,大小是8个字节。根据字节序的不同,UTF-16可以被实现为UTF-16LE或UTF-16BE,UTF-32可以被实现为UTF-32LE或UTF-32BE。再展开就可以写一篇论文了.对于程序员来说,只要知道有这几种unicode的不同实现就可以了.注意,utf8根据字符的不同,并不一定都需要3个字节来存一个字符.比如utf8跟ascii就是完全兼容的,说明它表示ascii字符只要一个字节就可以了.UTF-16长度相对固定,只要不处理大于\U200000范围的字符,每个Unicode代码点使用16位即2字节表示,超出部分使用两个UTF-16即4字节表示.UTF-32长度始终固定,每个Unicode代码点使用32位即4字节表示。
3.读取一个字符串并输出的流程至少分三步:
   1.从数据来源(比如一个文件)处读取二进制数据流并根据制定的编码转成字符
   2.这些转好的字符会被存在jvm中(用utf16编码存这些字符).
   3.等到要输出的时候,上一步的字符会根据你指定的编码转成二进制流存到一个文件中.
    String可以看作明文,byte[] 可以看作加密后的密文。

     编码就相当于加密策略。

     byte[] -> String 就相当于解密。
     String -> byte[] 就相当于加密。

     加密解密都需要事先知道加密策略(就是编码)。
   如果一个文件是utf8的,但你用gbk去读取,那肯定会变成没有意义和规律的乱码字符,这时候乱码字符存在jvm中.唯一的补救措施就是你把这些乱码指定gbk输出成二进制流(此时跟你直接读取原来文件的二进制流是相等的),再用utf8读取这个流,获得的就是正确的字符.
4.java默认的编码不是utf16,那是内部存储字符串的方式.java的默认编码是跟你的操作系统的默认编码是一样的.比如中文系统就是GBK.可以用Charset.defaultCharset()来获得java默认的编码是什么.

你可能感兴趣的:(java,jvm)