Java中String的编码问题

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。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值