java所使⽤的字符集是_Java常⽤字符集编码详解
Java常⽤字符集编码详解
Web开发的时候经常会遇到⼀些字符编码的错误,如页⾯乱码等问题,所以有必要需对字符编码有所了解,以下是Ricki收集的⼀些资料(可能不是很全,但希望对你有所帮助)
Java标准字符集:所谓Java标准字符集,就是Java平台⽀持的字符集:US-ASCII、ISO-8859-1、UTF-8、UTF-16BE、UTF-16LE、UTF-16。
US-ASCII
US-ASCII,这是⼀个出现得⽐较早的字符编码规范;因为它出现⽐较早,在通⽤型⽅⾯也考虑得⽐较少,所以也⽐较简单。⼀个ASCII字符⽤⼀个字节存储,也就是说它可以⽤来表⽰256个不同的字符。由于英⽂⼤⼩写字母、阿拉伯数字和标点符号等字符是有限的,所以就把前128个字符作为常⽤字符,⽽剩下的⾼位字符作为扩展字符。这128个字符通常⽤来表⽰⾳标、特殊字符等。
ISO-8859-1
ISO-8859-1也常被称为Latin_1(拉丁1)字符集,像MySQL的默认字符集就是ISO-8859-1,其他它与ASCI
I编码类似,也是⽤⼀个字节表⽰⼀个字符,也只⽤于表⽰英⽂字符、数字、符号及特殊字符。它与ASCII唯⼀的不同在于它是⼀个国际标准,⽽ASCII只是⼀个美国国家标准。
中⽂字符集
通过对上⾯两种字符集的了解,如果想⽤它们来表⽰中⽂字符集,显然有些不太现实,因为常⽤的中⽂字符都有上千个之多,所以我们需要能表⽰更多字符的字符集实现中⽂字符编码。但⼜为了兼容ASCII编码,中国在ASCII的基础上制定了⾃⼰的字符编码规范,也就是我们⽐较熟悉的GB2312,它的全称是GB2312-80信息交换⽤汉字编码字符集(基础集)。它能定义了7000多个常⽤汉字和符号,GB2312的实现是通过使⽤两个扩展ASCII字符来定义⼀个中⽂字符,根据这⼀特定,我们就可以判断相邻的两个ASCII字符是否为扩展字符,我们就可以确认这两个字符组成⼀个中⽂字符,但是在扩展ASCII字符中,也定义了⼀些其他字符,所以相邻两个ASCII同为扩展字符时,并不能肯定的说它是⼀个中⽂字符,处理起来是相当⿇烦的。
除了GB2312这个字符集以外,还有⼏个中⽂的字符集:Big5、HKSCS、GBK、GB18030。
——> Big5:台湾使⽤的编码标准,繁体中⽂字符,字符数也有7000多个。
——> HKSCS:⾹港使⽤的编码标准,繁体中⽂字符,但跟Big5不同
—
—> GBK:《汉字内码扩展规范》是GB2312的扩展集,不仅增加了⼤量简体中⽂字符和符号,也增加了对繁体中⽂字符的⽀持,另外还留有⽤户⾃定义字符空间,总共字符数在22000左右。
——> GB18030:《信息交换⽤汉字编码字符集 基本集的扩充》将会成为中国字符编码规范新标准,它兼容GB2312和GBK。
GB2312、Big5、HKSCS是同⼀时期的产物,虽然都是通过扩展ASCII来实现的,但是它们彼此之间并不兼容,GBK作为GB2312的扩展产物,它⼏乎涵盖了Big5⾥所有的繁体字,并将⼀些不常见的中⽂字符也添加进⼊标准,windows操作系统⽀持的中⽂字符集也就是GBK;GB18030是2000年制定的标准,它为了兼容GB2312和GBK,保留了双字节编码,同时为了扩展,新增了四字节编码,扩展后的GB18030字符集新增了部分少数民族⽂字,⽀持的字符数量⽐GBK多5000多个。
Unicode
通过对上⾯知识的学习,你就会觉得Unicode(Universal Multiple-Octet Coded Character Set)的出现是种必然,如果没有⼀套统⼀的字符编码标准,我们将举步维艰。Unicode提供了两套字符编码标准:
——> UCS-2(Unicode-16):2个字节字符编码
unicode码和ascii码区别——> UCS-4(Unicode-32):4个字节字符编码
Unicode编码能⽀持的字符数相当多,Unicode-16就能定义65535个字符,其中包含了⼤量中⽂字符(⼀个中⽂字符只暂⼀位)。
其实Unicode是⼀种理想化的字符标准,它并没有过多的考虑⽬前已经存在的字符集标准,它只与ISO-8859-1兼容,但它并不与ASCII兼容,想从ASCII编码转换为Unicode编码相当困难;另外,Unicode⾥很多字符都有‘0’字节,这将导致C语⾔会误认为它为字符串结束标志,这是相当可怕的,如果使⽤了Unicode编码,所有⽤C语⾔实现的系统将⽆法正常⼯作。这也是为何会出现UTF的原因。
UTF编码
UTF(UCS Transformation Format)实现了Unicode与计算机所使⽤的编码之间的映射关系。常⽤的UTF编码有:UTF-8、UTF-16、UTF-7等。
——> UTF-8:是三字节变长字符编码,它能兼容ASCII编码。
——> UTF-16:是Unicode的标准实现,与Unicode编码规范相同
——> UTF-16BE:UTF-16编码big endian,先存放⾼字节
——> UTF-16LE:UTF-16编码little endian,先存放低字节
其中,big endian和little endian是CPU处理多字节字符的不同⽅法,因CPU的不同⽽有所不同。另外,很多⼈都认为UTF-8和Unicode是⼀个概念,其实UTF-8只是Unicode标准的⼀种编码实现,是⽬前使⽤得⽐较多的字符编码格式之⼀。
PS:⼀、 各个国家和地区所制定的不同 ANSI 编码(不同的国家和地区制定了不同的标准,由此产⽣了 GB2312, BIG5, JIS 等各⾃的编码标准。这些使⽤ 2 个字节来代表⼀个字符的各种汉字延伸编码⽅式,称为 ANSI 编码)标准中,都只规定了各⾃语⾔所需的“字符”。⽐如:汉字标准(GB2312)中没有规定韩国语字符怎样存储。这些 ANSI 编码标准所规定的内容包含两层含义:
1.使⽤哪些字符。也就是说哪些汉字,字母和符号会被收⼊标准中。所包含“字符”的集合就叫做“字符集”。
2.规定每个“字符”分别⽤⼀个字节还是多个字节存储,⽤哪些字节来存储,这个规定就叫做“编码”。
各个国家和地区在制定编码标准的时候,“字符的集合”和“编码”⼀般都是同时制定的。因此,平常我们所说的“字符集”,⽐如:
GB2312, GBK, JIS 等,除了有“字符的集合”这层含义外,同时也包含了“编码”的含义。
“UNICODE 字符集”包含了各种语⾔中使⽤到的所有“字符”。⽤来给 UNICODE 字符集编码的标准有很
多种,⽐如:UTF-8, UTF-16, UnicodeLittle, UnicodeBig 等。
⼆、从计算机对多国语⾔的⽀持⾓度看,⼤致可以分为三个阶段:
系统内码 说明 系统
阶段⼀ ASCII 计算机刚开始只⽀持英语,其它语⾔不能够在计算机上存储和显⽰。 英⽂ DOS
阶段⼆ ANSI编码
(本地化) 为使计算机⽀持更多语⾔,通常使⽤ 0x80~0xFF 范围的 2 个字节来表⽰ 1 个字符。⽐如:汉字 '中' 在中⽂操作系统中,使⽤[0xD6,0xD0] 这两个字节存储。
不同的国家和地区制定了不同的标准,由此产⽣了 GB2312, BIG5, JIS 等各⾃的编码标准。这些使⽤ 2 个字节来代表⼀个字符的各种汉字延伸编码⽅式,称为 ANSI 编码。在简体中⽂系统下,ANSI 编码代表 GB2312 编码,在⽇⽂操作系统下,ANSI 编码代表 JIS 编码。
不同 ANSI 编码之间互不兼容,当信息在国际间交流时,⽆法将属于两种语⾔的⽂字,存储在同⼀段 ANSI 编码的⽂本中。 中⽂ DOS,中⽂ Windows 95/98,⽇⽂ Windows 95/98
阶段三 UNICODE
(国际化) 为了使国际间信息交流更加⽅便,国际组织制定了 UNICODE 字符集,为各种语⾔中的每⼀个字符设定了统⼀并且唯⼀的数字编号,以满⾜跨语⾔、跨平台进⾏⽂本转换、处理的要求。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论