Unicode

Context-Free Grammars

 语言和文法?语言我们知道,计算机语言,人类的语言,动物的语言,不同国家的语言,不同种族的语言等等。那神马是文法呢?所谓文法,文,文字,法,规则,法则,法律。组合起来就是,文字的规则。每种语言都有自己的文法,不同的语言有不同的文法。例如我们的中文的文法,用一种规则来定义句子的组成,还拿“我是中国人”为例。

Programs are written using the Unicode character set.

Java程序使用Unicode编写 , 有必要先了解Unicode的规范 ,并且不同版本JDK中使用不同的版本的Unicode , Java SE 5.0 (to Unicode 4.0), Java SE 7 (to
Unicode 6.0), and Java SE 8 (to Unicode 6.2) Java SE 5.0版本之前就不举出来了

Unicode is intended to cover all characters for all languages that have ever been written down through all of history

Unicode是什么

Unicode源于一个很简单的想法:将全世界所有的字符包含在一个集合里,计算机只要支持这一个字符集,就能显示所有的字符,再也不会有乱码了。

Unicode字符集可以简写为UCS(Unicode Character Set),早期的Unicode标准有UCS-2、UCS-4的说法。JavaScript 使用UCS-2 标准

它从0开始,为每个符号指定一个编号,这叫做”码点”(code point)。比如,码点0的符号就是null(表示所有二进制位都是0)。

U+0000 = null

上式中,U+表示紧跟在后面的十六进制数是Unicode的码点。

目前,Unicode的最新版本是7.0版,一共收入了109449个符号,其中的中日韩文字为74500个。可以近似认为,全世界现有的符号当中,三分之二以上来自东亚文字。比如,中文”好”的码点是十六进制的597D。

这么多符号,Unicode不是一次性定义的,而是分区定义。每个区可以存放65536个(2^16)字符,称为一个平面(plane)。目前,一共有17个(25)平面,也就是说,整个Unicode字符集的大小现在是2^21。

最前面的65536个字符位,称为基本平面(缩写BMP),它的码点范围是从0一直到216-1,写成16进制就是从U+0000到U+FFFF。所有最常见的字符都放在这个平面,这是Unicode最先定义和公布的一个平面。

剩下的字符都放在辅助平面(缩写SMP),码点范围从U+010000一直到U+10FFFF。

int min = UnicodeSet.MIN_VALUE ;
int max = UnicodeSet.MAX_VALUE ;

System.out.println(Integer.toHexString(min));  //0
System.out.println(Integer.toHexString(max));  //10ffff

Unicode 编码规则

  1. 从0开始编码U+0000 = null
  2. 最新版本是7.0
  3. 共109449个符号,其中的中日韩文字为74500个(68%)
  4. 2^16(65536)个号码组成一个平面(plane)
  5. 目前共有17个平面 , 整个空间大小:2^21
  6. 一个基本平面(BMP):U+0000 - U+FFFF
  7. 16个辅助平面(SMP) : U+010000 - U+ 10FFFFF

实现方式

在Unicode中:汉字“字”对应的数字是23383。在Unicode中,我们有很多方式 将数字23383表示成程序中的数据,包括:UTF-8、UTF-16、UTF-32。UTF是“UCS Transformation Format”的缩写,可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。例如,“汉字”对应的数字是 0x6c49和0x5b57,而编码的程序数据是:
BYTE data_utf8[] = {0xE6, 0xB1, 0x89, 0xE5, 0xAD, 0x97}; // UTF-8编码
WORD data_utf16[] = {0x6c49, 0x5b57}; // UTF-16编码
DWORD data_utf32[] = {0x6c49, 0x5b57}; // UTF-32编码
这里用BYTE、WORD、DWORD分别表示无符号8位整数,无符号16位整数和无符号32 位整数。UTF-8、UTF-16、UTF-32分别以BYTE、WORD、DWORD作为编码单位。“汉字”的UTF-8编码需要6个字节。“汉字”的 UTF-16编码需要两个WORD,大小是4个字节。“汉字”的UTF-32编码需要两个DWORD,大小是8个字节。根据字节序的不同,UTF-16可 以被实现为UTF-16LE或UTF-16BE,UTF-32可以被实现为UTF-32LE或UTF-32BE。下面介绍UTF-8、UTF-16、 UTF-32、字节序和BOM。

UTF-32与UTF-8

Unicode只规定了每个字符的码点,到底用什么样的字节序表示这个码点,就涉及到编码方法。
最直观的编码方法是,每个码点使用四个字节表示,字节内容一一对应码点。这种编码方法就叫做UTF-32。比如,码点0就用四个字节的0表示,码点597D就在前面加两个字节的0。

U+0000 = 0x0000 0000

U+597D = 0x0000 597D

UTF-32编码特点

  1. 4个字节表示一个字符
  2. 完全对应Unicode编码 ,比如,字母a为U+00000061
  3. 查找效率高 , 时间复杂度o(1)
  4. 缺点, 浪费空间 , 比相同ASCII编码文件大四倍

UTF-32的优点在于,转换规则简单直观,查找效率高。缺点在于浪费空间,同样内容的英语文本,它会比ASCII编码大四倍。这个缺点很致命,导致实际上没有人使用这种编码方法,HTML 5标准就明文规定,网页不得编码成UTF-32。

所以 我们需要一种节省空间的表示法!!!!!

人们真正需要的是一种节省空间的编码方法,这导致了UTF-8的诞生。UTF-8是一种变长的编码方法,字符长度从1个字节到4个字节不等。越是常用的字符,字节越短,最前面的128个字符,只使用1个字节表示,与ASCII码完全相同。

编号范围 字节
0x0000 - 0x007F 1
0x0080 - 0x07FF 2
0x0800 - 0xFFFF 3
0x010000 - 0x10FFFF 4

由于UTF-8这种节省空间的特性,导致它成为互联网上最常见的网页编码。不过,它跟今天的主题关系不大,我就不深入了,具体的转码方法,可以参考我多年前写的《字符编码笔记》。

UTF-16

 System.out.println(Integer.toHexString( UTF16.LEAD_SURROGATE_MIN_VALUE));  //55296 U+d800
 System.out.println(Integer.toHexString( UTF16.LEAD_SURROGATE_MAX_VALUE));  //56319 U+dbff
System.out.println(Integer.toHexString( UTF16.TRAIL_SURROGATE_MIN_VALUE));  //56320 U+dc00
System.out.println(Integer.toHexString( UTF16.TRAIL_SURROGATE_MAX_VALUE));  //57343 U+dfff

String

Strings computed by concatenation at run time are newly created;

The string concatenation operator + (§15.18.1) implicitly creates a new String
object when the result is not a constant expression

        String hello = "Hello", lo = "lo";
        System.out.print((hello == "Hello") + " ");
        System.out.print((hello == ("Hel"+"lo")) + " ");
        System.out.print((hello == ("Hel"+lo)) + " ");
        System.out.println(hello == ("Hel"+lo).intern());

[http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/sun/text/normalizer/UTF16.java]

http://blog.csdn.net/mylinx/article/details/6874414
http://www.ruanyifeng.com/blog/2014/12/unicode.html

Page 362

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值