1.在Java 中,String的默认编码格式是unicode。
Java内部字符串String用得都是是Unicode编码,所以Java内部的字符串可以说是没有编码的,只有bytes[]有编码!但是java平台是有编码的,编码为平台(操作系统)默认编码,但是对于别的平台如数据库、文件、网页(浏览器)等,编码不一样!
我们可以通过实验看出,调用Charset.defaultCharset():
import java.nio.charset.Charset;
public class javaCode {
public static void main(String args[])
{
String defaultCharsetName=Charset.defaultCharset().displayName();
System.out.println("defaultCharsetName:"+defaultCharsetName);
}
}
显示结果为:
defaultCharsetName:GBK
多次试验发现,这个默认字符编码是由windows的语言地域里的设定决定的
2.Java里面的每一个String都是unicode编码。
3.new String(text.getBytes("ISO-8859-1"),"GBK")
是因为一个GBK的字节流被错误地以ISO-8859- 1的方式转换为String(unicode)了!
4.iso-8859-1编码规则,ISO-8859-1通常叫做Latin-1, 每一个字节直接作为一个 UNICODE 字符。比如,[0xD6, 0xD0] 这两个字节,通过 iso-8859-1 转化为字符串时,将直接得到 [0x00D6, 0x00D0] 两个 UNICODE 字符,即 "&214;&208;"。
反之,将 UNICODE 字符串通过 iso-8859-1 转化为字节串时,只能正常转化 0~255 范围的字符。
一个 UNICODE 字符可能转化成一个字节或多个字节。
而为什么ISO-8859-1能够显示中文呢?
从本质上说,ISO-8859-1是单字节编码,自身不能显示中文,若要显示中文,必须和其他能显示中文的编码配合,如“GBK”,“UTF-8",以ISO-8859-1编码的文本,都以bytes[]的形式保存,若要显示中文,只需以显示平台的默认编码格式进行解码即可。若仍然以ISO-8859-1格式解码,得到的中文字符肯定是乱码,因为ISO-8859-1自身不能显示中文。
Java内部字符串String用得都是是Unicode编码,所以Java内部的字符串可以说是没有编码的,,只有bytes[]有编码!但是java平台是有编码的,编码为平台(操作系统)默认编码,但是对于别的平台如数据库、文件、网页(浏览器)等,编码不一样!
5.ANSI 编码的特点:
a. 这些ANSI 编码标准都只能处理各自语言范围之内的 UNICODE 字符。
b. “UNICODE 字符”与“转换出来的字节”之间的关系是人为规定的。与“ANSI 编码”类似的,把字符串通过UNICODE编码转化成“字节串”时,一个UNICODE字符可能转化成一个字节或多个字节。
6.UNICODE编码与“ANSI 编码”不同的是:
a 这些“UNICODE 编码”能够处理所有的UNICODE字符。
b.“UNICODE字符”与“转换出来的字节”之间是可以通过计算得到的。
7.当我们要把一个“字节串”转化成“字符串”,而又不知道它是哪一种ANSI编码时,先暂时地把“每一个字节”作为“一个字符”进行转化,不会造成信息丢失。然后再使用 bytes = string.getBytes("iso-8859-1") 的方法可恢复到原始的字节串。
8.UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:
UCS-2编码(16进制) UTF-8 字节流(二进制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
例 如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。