1. 程式人生 > >正則表示式——Unicode

正則表示式——Unicode

第 7 章 Unicode

7.1 關於編碼

  通常,英文編碼較為統一,都採用ASCII編碼或可以相容ASCII編碼(即編碼表的前127位與ASCII編碼一直,常見的各種編碼,包括Unicode編碼都是如此)。也就是說,穩贏字母、阿拉伯數字、穩贏的各種符號,在不同編碼下的碼值(Code Point)基本是一樣的,比如字母A,起碼值總是41;中文的情況則不同,常見的中文編碼有GB18030(也就是CP54936,主要是在Windows平臺下使用。早期是GBK,也就是CP936,如今採用的GB18030與GBK是相容的,考慮到大家習慣說“GBK編碼”,下文也採用“GBK編碼”的說法)和Unicode(主要用於Linux/UNIX、Mac OS)兩種,同一個中文字元在兩種編碼下的碼值並不相同。比如“發”,在GBK編碼下的碼值為b7a2,而在Unicode下其碼值為53d1(根據慣例,Unicode字元一般即為\uhex的形式,其中hex是碼值的十六進位制表示,所以“發”的Unicode記法就是\u53d1).

  為方便下面的講解,這裡先約定兩種提法:

  ASCII字元,即ASCII編碼表中的字元(也就是碼值在0 ~ 127之間的字元,不包括擴充套件ASCII字元),每個字元用一個位元組表示。常見的英文字元和半形標點符號,都屬於ASCII字元。

  非ASCII字元,即ASCII編碼表之外的字元,在本書中指多位元組字元。中文字元屬於“非ASCII字元”,它們在GBK編碼中一般佔用2個位元組,在UTF-8編碼中佔用3個位元組。常見的Unicode編碼是UTF-8,它是Unicode的一種儲存格式,UTF-16也是一種儲存格式。無論是UTF-8還是UTF-16,同一字元的Unicode編碼是不變的,只是儲存時的變現形式不同。比如“發”的碼值53的,但以UTF-8編碼儲存時佔用3個字元,分別是e5 8f 91,儲存為UTF-16編碼時佔用用2個字元,分別53 d1。