Quantcast
Channel: Sam的技术Blog
Viewing all articles
Browse latest Browse all 158

Python3多国语言处理

$
0
0
作者: Sam (甄峰)  sam_code@hotmail.com

在Python中遇到中文或多国语言,常常会遇到字符编码问题。现将其记录如下:

0. Unicode, UTF-8, UTF-16, UTF-32, UCS-2, UCS-4等缘起和概念
世界各国都有各自的文字编码集,互不兼容,相同的编码值,在不同的语言文字编码集中代表不同的符号。因此,同一份文档copy到不同语言的机器中,就可能显示乱码,无法阅读。于是,就有了一个需求:定义一个超大的字符集,包含全世界所有文字字符,让每种语言的每个字符都对应唯一的编码值。

有两个不同的机构分别作出了自己的标准:
A. 国际标准化组织(ISO), 在1984年尝试制定通用字符集(Universal Character Set) UCS.  即为ISO 10646标准。
B. 统一编码联盟。 发起了Unicode标准。

之后,双方尝试合并工作成果。从Unicode 2.0开始, Unicode采用了与ISO 10646标准相同的字库和字码。 ISO 10646也将不会为超出10FFFF的UCS-4编码赋值。 以使得两者保持一致。

0.1: UCS-4 和 UTF-32:
ISO 10646标准为通用字符集(UCS)定义了一种31位的编码 UCS-4. 其编码固定占用4个字节,编码空间为:0x0000000-0x7FFFFFFF. 共可以编码2的31次方个字符(2147483648)。
但其实使用范围不超过0x10FFFF个。且为了兼容Unicode标准。ISO也承诺将不会为超出范围的USC-4编码赋值。
UTF-32编码的编码值与UCS-4相同。

0.2: UCS-2和UTF-16:
除了UCS-4, ISO 10646标准为通用字符集(UCS)定义了一种16位的编码形式---UCS-2. 其编码固定占用2字节。所以包含65536个编码空间。为了兼容Unicode, 0xD800-0xDFFF之间的编码未使用。所以它只支持63K个常用字符编码。
UTF-16则稍有不同,它使用2个字节对全世界最常用的63K字符编码(与UCS-2的常用编码相同),使用4个字节对不常用的字符进行编码,数据变长编码。所以它可以为Unicode中所有字符进行编码。

0.3:UTF-8
UTF-16, UTF-32都需要多个字节表示一个字符编码。对纯粹英语字符有些浪费。所以有了UTF-8.
它的原则是:ASCII码中的字符,还是ASCII码的值,只需要一个字节表示。其它的Unicode字符集中的字符编码,则使用2,3,4字节来表示。

0.4:Unicode与UTF-8, UTF-16, UTF-32的关系:
Unicode是一个字符集,包含全世界所有的字符。
而UTF-8, UTF-16, UTF-32则是对Unicode中所有字符的不同编码方式。

1. Python2和Python3的Unicode问题
Python3 里有两种表示字符序列的类型,分别是 bytes 和 str,bytes 的实例包含 8 位值,str 的则包含 Unicode 字符。
Python2 中也有两种表示字符序列的类型,分别是 str 和 Unicode. str 的实例包含原始的 8 位值,而 Unicode 的实例包含 Unicode 字符。这是什么意思呢?也就是说 Python3 中字符串默认为 Unicode,但是如果在 Python2 中需要使用 Unicode,必须要在字符串的前面加一个 「u」前缀.






 

Viewing all articles
Browse latest Browse all 158

Trending Articles