Java 编码

2017/01/11

一部关于java编码的欲仙欲死之旅……

概述

总的来说,我在这里是以java的角度来讲述一下我对字符编码的理解,然后……就没有然后了,还是继续看下面吧

编码格式

关于常见的编码格式嘛,网上一搜”字符编码”就一大把,我在这里就不再累述了,总是说重复的东西我觉得没什么意思啊,就好像我自己理解完然后再写出这篇东西,就花了很多时间去搜啊搜,还得过滤一堆没用的,重复的东西,事情总是惊人的相似.好了,好像跑题了,回到正题. 常见的字符编码格式有iso 8859-1,gb2312,gbk,gb18030,big5,unicode 等等.那么问题来了,有些聪明的童鞋也许会问,utf-8,utf-16甚至还有个utf-32呢??很多文章都说,这3个玩意是Unicode的实习方式,啊….看的我云里雾里,什么玩意儿?是Unicode的实现方式?然后又和Unicode不一样,然后又不能说他们不是字符编码格式,因为现在满大街的utf-8,Unicode倒是很多人不知道是什么鬼.

Unicode(UTF-8, UTF-16)令人混淆的概念

友情提示,这个标题可以点啊,点进去就是一个网页,看完就懂了…….又省了不用打字了

然后回到java

java的字符编码分为 内码外码.你或许想说,什么鬼?但是,就是这么回事.

内码

  • 所谓 内码 就是java保存字符串在内存中使用的编码,java的 内码 使用的是UTF-16(Unicode编码).
  • 一个无论经过了什么编码的2进制数组一旦转成String之后,在String内的字符编码就是UTF-16.java底层保存了各种码表,实现utf-16和不同编码间的互相转换

外码

  • 通俗点说 外码 就是指java的class文件的编码(我这样说,我以后看到也好记点,要详细理解 外码 是什么,自己Google一下吧),java的外码使用的是 modified utf8 (反正是种utf-8的修改版,我没有深入研究).

  • 对于源码的编码没有什么严格的规定,ide之类的编译工具在编译源码的时候会自动帮你加上指定编码的参数到javac(或者其他编译器)从而正确编译源码文件成class文件(字符编码为modified utf8的字节码文件),如果编译的时候发现什么编码的问题,或许就是编译的时候没有添加编译所需的指定编码的参数

黑洞

一个指定编码的字符串如果在不同的字符编码中切换(意思就是编码,解码…),就有可能造成信息的丢失,我们就称之为 黑洞,举个,例子.

总结

所有java的String实例都是用的Unicode编码的utf-16实现,无论是读进来之前的字节数组用的是什么编码.而且如果要把一个已经用了指定编码的字节数组实例化成String之前,一定要指定这个数组的编码.

最后再来个参考链接