java 字符码_Java字符编码详解

char

“字节”是byte,“位”是bit ;

1 byte = 8 bit ;

char 在Java中是2个字节。java采用unicode(《java核心技术卷一》里面有详细说明),2个字节(16位)来表示一个字符。而Unicode编码包括汉字,所以也可以给char赋值汉字。

那么我们在程序中的char =‘\123’和char = ‘\u0023’甚至’\”’这些又是怎么回事呢?

这个需要从计算机的历史说起。

Ascii及中国的编码

既然是程序员,那么大家对Ascii肯定有一定的了解。

Ascii(American Standard Code for Information Interchange),美国信息互换标准代码,官方的ASCII码表如下->AsciiTABLE。

Ascii为八位一个字节,一共可以组合出256(2的8次方)种不同的状态。

一开始美国人把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端、打印机遇上约定好的这些字节被传过来时,就要做一些约定的动作。遇上00x10, 终端就换行,例好遇上0x1b, 打印机就打印反白的字,或者终端就用彩色显示字母。

这些0x20以下的字节状态称为”控制码”。

接着把所有的空格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第127号,这样计算机就可以用不同字节来存储英语的文字了。

后来,就像建造巴比伦塔一样,世界各地的都开始使用计算机,但是很多国家用的不是英文,他们的字母里有许多是ASCII里没有的。他们决定采用127号之后的空位来表示这些新的字母、符号,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到了最后一个状态255。

从128到255这一页的字符集被称”扩展字符集”。

等到我们天朝用计算机时发现挖槽你他妈一个位置都没留给我,我还有几千上万个文字要保存呢,于是我们自己创造了两个字节编码的“GB2312”以及之后的同样是两个字节的“GBK”。之后“GBK”扩展为“GB18030”,这些编码标准被通称为 “DBCS”(Double Byte Charecter Set 双字节字符集)。

DBSC系列的标准的最大特点是,最大的特点是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里,如果一个字节小于127那么按照Ascii的编码,如果大于127那么其和后面的字符组成一个汉字字符。

然后各国也是按照自己的需求弄了一套自己可用的编码。很愉快大家都能用了,接着发现不对啊,各个国家之间电脑需要交流,你的资源到我这里编程乱码,我的资源你也用不了。

于是。。一个叫 ISO (国际标谁化组织)的国际组织决定着手解决这个问题。他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号的编码!他们打算叫它”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “UNICODE”。

Unicode的字符编码表:来自维基百科的Unicode编码表

对于ascii里的那些“半角”字符(即前面排到128个字符),UNICODE 包持其原编码不变,只是将其长度由原来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于”半角”英文符号只需要用到低8位,所以其高8位永远是0,因此这种大气的方案在保存英文文本时会多浪费一倍的空间。

Unicode及UTF

UNICODE 是用两个字节来表示为一个字符,他总共可以组合出65535不同的字符,这大概已经可以覆盖世界上所有文化的符号。UNICODE 如何在网络上传输也是一个必须考虑的问题,于是面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF8就是每次8个位传输数据,而UTF16就是每次16个位,只不过为了传输时的可靠性,从UNICODE到UTF时并不是直接的对应,而是要过一些算法和规则来转换。而且网络传输字符编码也涉及到大端小端的问题。

java中的编码

前面说了,java使用到编码是UNICODE。怎么具体“体会到”这种编码呢?我们可以用java中的转义符 \。

一、我们直接使用“\”来转化数字为字符的话,后面的数字应为八进制。

而且只能转化一个字节大小,即255个字符,如下:

八进制转义序列:\ + 八进制数;范围’\000’~’\377’(对应十进制0~255)

\0:空字符

有人问了Unicode不是两个字节吗,为什么这里一个字节就可以,其实java在这里会把它转化为两个字节按Unicode转换。记住是Unicode,不要因为一个字节就以为是ASCII编码,如下代码:

System.out.println('\367'); //这里输出的是 ÷

//八进制367转化为10进制为247

System.out.println((int) '÷');//输出十进制:247

//序号247在Ascii和Unicode对应的字符如下:

Ascii:

0818b9ca8b590ca3270a3433284dd417.png

Unicode:

0818b9ca8b590ca3270a3433284dd417.png

二、 Unicode转义字符:\u + 4个十六进制数字;对应十进制范围是0~65535

\u0000:空字符

//八进制367对应十六进制00F7,所以下面两个输出都是 ÷

System.out.println('\367');

System.out.println('\u00F7');

System.out.println('\u0000~uFFFF'); //我们电脑出现的每个汉字都包含在这其中

三、 特殊字符:就3个

因为在Java中 双引号”、引号’、反斜杆\ 都有特定的含义,双引号要包住字符串,引号要包住字符,反斜杠是转义符,所以我们通过在加一个转义符\让他们真正代表他们自己。

\”:双引号

\’:单引号

\:反斜线

String fieldsNmae = "呵呵";

System.out.println("fieldsName:\"" + fieldsNmae + "\"");

//不复杂,你就把\"当成字符,输出:fieldsName:"呵呵"

四.控制字符:5个

转义符\加固定字符在java中有五个,表示一定的控制操作

\r 回车

\n 换行

\f 走纸换页

\t 横向跳格

\b 退格

System.out.println("开心\n就好");

//输出:

开心

就好

最后要注意,Java是平台无关的,存储默认是大端。而机器用大端还是小端是处理器决定的,跟系统没有关系。

中文的半角和全角

在DBCS系列的编码里面,把连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在127号以下的那些就叫”半角”字符了。所以如果这些例如字母使用一个字节编码就是“半角”,两个字节就是“全角”。其实样子看起来还是有区别的:

半角:abcdefghi

全角:abcdefghi

博主是最帅的程序员

//可以看出全角字母和中文一样都是占用这相同的空间大小

(unicode里面对这些全角字符也有对应的编码)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值