Unicode 规定了所有字符所对应的唯一编码(类似于ID号),最新的 Unicode 6.2 中定义了 110, 117 个字符。在大部分语言中,Unicode字符串都能够以 \uhhhh
的形式表示。任何数据保存到计算机中都会以字节来表示。将 Unicode 字符保存为字节有很多种实现方式。比较常见的就有 UTF-32 和 UTF-8。前者以每个字符固定4个字节的方式保存,后者是可变长的编码,最大长度为6个字节。两者实际都能够储存 2, 147, 483, 648** 个字符,在遭遇地外文明之前完全够用了。
文本主要介绍 Unicode 和 UTF-8 间的转换,关于 UTF-8 的具体实现方式可查看注释。这里仅举个简单的例子
Unicode 中 '汉' 字的二进制表示
1101100 01001001
UTF-8 中 '汉' 字的二进制表示,连接 |
后的二进制编码得到就是 Unicdoe 码点
1110|0110 10|110001 10|001001
介绍在 python, ruby 和 javascript 中两者间的相互转换
#1
len(u'汉'.encode('utf-8')) # => 3
#2
ord(u'汉') # => 27721
#3
unichr(22721) #=> u'汉'
#4
map(ord, u'汉'.encode('utf-8')) # => [230, 177, 137]
#1
'汉'.bytesize # => 3
#2
'汉'.ord # => 27721
#3
27721.chr('utf-8') # => '汉'
#4
'汉'.bytes.to_a # => [230, 177, 137]
在浏览器中计算 UTF-8 字节长度也十分容易,关于使用 javascript 实现的 utf-8 编码请参考本文末的链接
encodeURIComponent(text).replace(/%[A-F\d]{2}/g, 'U').length // => 3