久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Unicode字符編碼標(biāo)準(zhǔn)

 jp乞巧樓 2015-08-07
Unicode

1. 編碼知識(shí)
1.1 文本和字符
在計(jì)算機(jī)程序中或者數(shù)據(jù)文件里,,文本(text)是作為數(shù)字序列存儲(chǔ)的,。序列中的數(shù)字是具有不同大小,、取值和解釋的整數(shù),。如何解釋這些整數(shù)是由字符集(character set),、編碼(encoding)決定的,。
文 本主要是由字符(character)組成,。在格式文本(fancy text, or rich text)中包括顯示屬性,如顏色,、斜體字,、上標(biāo)等,但仍然是以字符組成的純文本(plain text)為基礎(chǔ)的,。有時(shí),,格式文本與純文本之間的區(qū)別很復(fù)雜,依賴于具體的應(yīng)用,。
什么是字符,?典型地,,是字母。也可以是數(shù)字,、句點(diǎn),、連字號(hào)、標(biāo)點(diǎn)符號(hào)和數(shù)學(xué)符號(hào),,對(duì)于中文,,也可以是漢字。還包括定義行尾和段落等的控制字符(一般不可見),。
有了字符,就可以為它們分配數(shù)字編碼,。為字符分配什么數(shù)字值,,依賴于具體情況。一個(gè)簡(jiǎn)單的字符,,如字母"a",,在不同的程序或者數(shù)據(jù)文件中可能具有不同的整數(shù)值。
1.2 字符集:具有數(shù)字編碼的字符
在信息處理中,,所使用的整數(shù)總有上限,,依賴于存儲(chǔ)整數(shù)的位的數(shù)目。這也決定了可以同時(shí)區(qū)分的字符的數(shù)量,。
在設(shè)計(jì)字符集時(shí),,首先要決定所需字符的數(shù)目,并確定所需字符的清單,。根據(jù)字符的數(shù)目,,可以設(shè)定整數(shù)值的上限,這個(gè)整數(shù)范圍稱為編碼空間(code space),,其中的一個(gè)特定整數(shù)稱為一個(gè)碼點(diǎn)(code point),。
然后,為字符清單中的每個(gè)字符指定一個(gè)整數(shù)值,,也就是一個(gè)碼點(diǎn),。這樣就得到一個(gè)字符集,稱作編碼字符集(Coded Character Set),。
1.3 編碼單元,、字節(jié)和編碼
在 計(jì)算機(jī)系統(tǒng)的實(shí)現(xiàn)中,整數(shù)以特定大小的單元表示,,通常為8位(1字節(jié)),,16位,或32位,。在字符編碼中,,這樣的單元稱為編碼單元(code unit),。根據(jù)編碼空間的大小和具體要求,來選擇合適的編碼單元,。通常,,所選擇編碼單元對(duì)應(yīng)的整數(shù)范圍要大于編碼空間的整數(shù)范圍,這樣每個(gè)碼點(diǎn)就只需一 個(gè)編碼單元表示,,并且在字符碼點(diǎn)與編碼單元間的轉(zhuǎn)換非常簡(jiǎn)便,,因?yàn)樽址a點(diǎn)對(duì)應(yīng)的整數(shù)值與相應(yīng)編碼單元的整數(shù)值相同。如果編碼單元對(duì)應(yīng)的整數(shù)范圍小于編碼 空間的整數(shù)范圍,,就需要多個(gè)編碼單元表示一個(gè)碼點(diǎn),。
字節(jié)是計(jì)算機(jī)系統(tǒng)中最基本的表示單元,無論是存儲(chǔ)在內(nèi)存中,,還是將文本寫入文件或通過網(wǎng)絡(luò)發(fā)送,,總是要讀寫若干字節(jié)。因此,,在實(shí)際應(yīng)用中,,還需要將編碼單元進(jìn)一步表示為字節(jié)序列。
將字符表示為字節(jié)序列的過程就稱為編碼(encoding),,更重要的是,,還包括如何對(duì)字節(jié)序列進(jìn)行解釋以取得字符。
1.4 不同的字符集
在一些常用的編碼中,,每個(gè)字符只使用一個(gè)字節(jié)表示,,稱單字節(jié)字符集(single-byte character set, SBCS)。這些字符集都僅限于256個(gè)字符,。
在ASCII之后,,目前應(yīng)用最廣泛的單字節(jié)字符集是ISO-8859-1。它是ASCII的一個(gè)8位超集,,并且提供西歐語言所需的大多數(shù)字符,。它的一個(gè)改進(jìn)的版本,ISO-8859-15,,還包括新的歐元符號(hào)和更多的一些法語和芬蘭語字母,。
    雙字節(jié)字符集(double-byte character set, DBCS)用于為東亞書寫系統(tǒng)中所使用成千上萬個(gè)表意字符提供足夠空間。這里的編碼仍是基于字節(jié)的,,不過是兩個(gè)字節(jié)一起表示一個(gè)單一的字符,。
    即使在東亞,文本中也會(huì)包含小字母表中的字母,,如拉丁字母表,。這些字母使用單字節(jié)表示的效率會(huì)更高。因此,提出了多字節(jié)字符集(multi-byte character set, MBDC),,使用可變數(shù)目的字節(jié)來表示字符,。多字節(jié)字符集通常與ASCII兼容,也就是說,,在這種編碼中,,拉丁字母使用與ASCII中相同的字節(jié)來表示。 一些不常用的字符可能會(huì)使用三個(gè)甚至四個(gè)字節(jié)編碼,。
1.4 常見字符集
1.4.1 ASCII: The American Standard Code form Information Interchange
    ASCII是一個(gè)使用7位單元的字符集,,及針對(duì)7位字節(jié)的簡(jiǎn)單編碼方式。盡管局限于很少的一些字符,,ASCII是最重要的一種字符集,,因?yàn)樗悄壳按蠖鄶?shù)字符集的基礎(chǔ)。
    ASCII只提供了128個(gè)數(shù)字值(也可稱作碼點(diǎn),,code point),,其中33個(gè)被保留用作特殊功能。只有95個(gè)碼點(diǎn)用作"真正的"文本字符,。這些圖形字符大多時(shí)大寫和小寫拉丁字母,數(shù)字和標(biāo)點(diǎn)符號(hào),,外加一些特殊的括號(hào),、下劃線和重音符號(hào)。
1.4.2 EBCDIC: The Extended Binary-Coded Decimal Interchange Code
EBCDIC是由IBM設(shè)計(jì)的編碼格式,,使用8位字節(jié),,被一些字符集用于大型機(jī)。EBCDIC在與ASCII相近的時(shí)期開發(fā)的,,具有一些相似的特性,。
1.4.3 Unicode
Unicode標(biāo)準(zhǔn)定義了一個(gè)字符集和幾種編碼。
Unicode最有吸引力的特點(diǎn)是它涵蓋了幾乎世界上的所有字符,,可以只通過一個(gè)唯一的數(shù)字(Unicode碼點(diǎn))來訪問和操作字符,。
2. Unicode介紹
2.1 為什么使用Unicode?
在創(chuàng)造Unicode之前,有數(shù)百種編碼系統(tǒng),。但是,,沒有任何一個(gè)編碼可以包含足夠的字符。例如,,僅歐州共同體就需要好幾種不同的編碼來包括所有的語言,。即使是單一的一種語言,如英語,,也沒有哪一個(gè)編碼可以適用于所有的字母,,標(biāo)點(diǎn)符號(hào),和常用的技術(shù)符號(hào)。
這些編碼系統(tǒng)也會(huì)互相沖突,。也就是說,,兩種編碼可能使用相同的數(shù)字代表兩個(gè)不同的字符,或使用不同的數(shù)字代表相同的字符,。任何一臺(tái)特定的計(jì)算機(jī)(特別是服務(wù)器)都需要支持許多不同的編碼,,但是,不論什么時(shí)候數(shù)據(jù)通過不同的編碼或平臺(tái)之間,,那些數(shù)據(jù)總會(huì)有損壞的危險(xiǎn),。
而Unicode正在改變所有這一切!
在Unicode標(biāo)準(zhǔn)中,,提供了1,114,112個(gè)碼點(diǎn),,不僅可以包含當(dāng)今世界使用的所有語言文字和其他符號(hào),也足夠容納絕大多數(shù)具有歷史意義的古文字和符號(hào),。并且,,Unicode給每個(gè)字符提供了一個(gè)唯一的數(shù)字,不論是什么平臺(tái),,不論是什么程序,,不論什么語言。
Unicode 標(biāo)準(zhǔn)已經(jīng)被工業(yè)界的領(lǐng)導(dǎo)們所采用,,例如:Apple, HP, IBM, JustSystem, Microsoft, Oracle, SAP, Sun, Sybase, Unisys等等,。最新的標(biāo)準(zhǔn)都需要Unicode,例如XML, Java, ECMAScript , LDAP, CORBA 3.0, WML等等,,并且,,Unicode是實(shí)現(xiàn)ISO/IEC 10646的正規(guī)方式。許多操作系統(tǒng),,所有最新的瀏覽器和許多其他產(chǎn)品都支持它,。Unicode標(biāo)準(zhǔn)的出現(xiàn)和支持它工具的存在,是近來全球軟件技術(shù)最重要 的發(fā)展趨勢(shì),。
2.2 Unicode與國(guó)際化
直到最近,,國(guó)際化的常用方法是,假定任何給定的可執(zhí)行程序同時(shí)只和一種語言工作,。如果在英文環(huán)境下安裝,,它就只處理英文文本;如果在中文環(huán)境下安裝,,就只處理中文文本,。
在 這種模型下,針對(duì)不同的書寫系統(tǒng)和語言,,使用的字符集和字符編碼不同,。在Windows和大型機(jī)環(huán)境下,術(shù)語"代碼頁"(Code Page)用于描述如何將二進(jìn)制值映射到人類可讀得字符(字形)。一個(gè)運(yùn)行的程序處在單一的代碼頁,,該代碼頁確定二進(jìn)制值如和與字形關(guān)聯(lián),。
簡(jiǎn)便的國(guó)際化是Unicode的另一項(xiàng)優(yōu)勢(shì)。在內(nèi)部使用Unicode的應(yīng)用程序,,能夠同時(shí)存儲(chǔ)和處理世界上所有的字符,,這消除了傳統(tǒng)的國(guó)際化方法所面臨的一些困難。
當(dāng)然,,成功的國(guó)際化不僅僅是在應(yīng)用程序中采用Unicode,,還需要謹(jǐn)慎的屏幕布局設(shè)計(jì)(不同的語言具有不同的書寫習(xí)慣)、翻譯和文化理解,。
2.3 設(shè)計(jì)原則
Unicode的設(shè)計(jì)反映了十大基本原則,,但這些原則并不是可以同時(shí)滿足。整個(gè)設(shè)計(jì)是在保證簡(jiǎn)便高效和保持與已有編碼標(biāo)準(zhǔn)兼容之間的平衡,。
(1)廣泛性(Universality)
Unicode標(biāo)準(zhǔn)對(duì)一個(gè)單一的大字符集進(jìn)行編碼,,包括滿足世界范圍需求的所有字符。
(2)高效(Efficiency)
在Unicode的字符編碼模型中沒有換碼符(escape character),,每個(gè)字符編碼與其它字符編碼具有相同的狀態(tài),。使高效率的實(shí)現(xiàn)成為可能。
所有Unicode編碼方式都是自同步的,,并且相互不重疊,。使在字符流中隨機(jī)訪問和查找操作高效。
同一書寫字母體系中的字符被放置在一起,,不僅方便字符的查找,并且使實(shí)現(xiàn)更緊湊壓縮方法更高效,。
(3)針對(duì)字符編碼,,而不是字形(Character, Not Glyph)
字符是書寫語言中具有語義的最小組件的抽象表示。字符是以駐留在內(nèi)存中的碼點(diǎn)表示,。
字形是字符被顯示時(shí)具有的形狀,。與字符相比,字形出現(xiàn)在屏幕或紙張上作為一個(gè)或多個(gè)字符的特定表示,。字形的集合構(gòu)成一種字體,。
字符和字形間存在多種關(guān)系:一個(gè)字形可以對(duì)應(yīng)一個(gè)字符;一個(gè)字形也可以對(duì)應(yīng)幾個(gè)字符,;多個(gè)字形也可能出自一個(gè)字符,。
(4)語義(Semantic)
在Unicode中,字符都有明確定義的語義,。字符屬性表可用于解析,、排序等需要有關(guān)碼點(diǎn)語義知識(shí)的算法中。Unicode中定義的屬性包括數(shù)字、間隔,、組合和方向?qū)傩浴?
(5)純文本(Plain Text)
純文本或無格式文本,,僅僅是字符編碼的序列。純Unicode文本就是Unicode編碼的序列,。而格式文本(styled text, or rich text)是由純文本添加一些附加信息(如語言標(biāo)識(shí),、字體大小、顏色等)組成的文本表示,。
Unicode標(biāo)準(zhǔn)針對(duì)的是純文本,。
(6)邏輯順序(Logical Order)
Unicode文本在內(nèi)存表示中以邏輯順序存儲(chǔ),大致對(duì)應(yīng)于借助鍵盤輸入文本的順序,。在一些情況下,,當(dāng)顯示或打印文本時(shí),字符順序與邏輯順序不同,。
(7)統(tǒng)一(Unification)
Unicode標(biāo)準(zhǔn)為避免對(duì)字符重復(fù)編碼,,對(duì)不同語言書寫方式中的字符進(jìn)行統(tǒng)一,相同的字符分配唯一的一個(gè)編碼,。普通字母,、標(biāo)點(diǎn)符號(hào)、標(biāo)記,,和變音符都只分配一個(gè)編碼,,而不管語言;同樣的還有中日韓使用的表意字符,。
(8)動(dòng)態(tài)組合(Dynamic Composition)
Unicode標(biāo)準(zhǔn)允許加重音符好的形式和Hangul音節(jié)的動(dòng)態(tài)組合,。
(9)等價(jià)序列(Equivalent Sequences)
一些文本元素即可以使用靜態(tài)的預(yù)先組合好的形式,也可使用動(dòng)態(tài)組合的形式,。Unicode字符的不同表示序列被認(rèn)為是等價(jià)的,。
如果兩個(gè)或多個(gè)序列被認(rèn)為是等價(jià)的,Unicode標(biāo)準(zhǔn)不規(guī)定哪一種特定的序列是正確的,,而認(rèn)為每一個(gè)序列只不過與其它序列等價(jià),。
如 果需要一種單一的單一的表示方式,可以使用一種規(guī)范化的Unicode文本形式來減少不想要區(qū)別,。Unicode標(biāo)準(zhǔn)定義了四種規(guī)范化形式: Normalization Form D (NFD),,Normalization Form KD (NFKD),Normalization Form C (NFC),,和Normalization Form KC (NFKC),。大約來說,NFD和NFKD將可能的字符進(jìn)行分解,,而NFC和NFKC將可能的字符進(jìn)行組合,。
(10)可轉(zhuǎn)換性(Convertibility)
在Unicode 標(biāo)準(zhǔn)和其他字符集標(biāo)準(zhǔn)之間可以實(shí)現(xiàn)準(zhǔn)確的轉(zhuǎn)換,。一般說,在其他標(biāo)準(zhǔn)中的一個(gè)碼點(diǎn)對(duì)應(yīng)于Unicode標(biāo)準(zhǔn)中一個(gè)單一的碼點(diǎn),。然而,,有時(shí)在其他標(biāo)準(zhǔn)中的一個(gè) 碼點(diǎn)對(duì)應(yīng)于Unicode標(biāo)準(zhǔn)中一個(gè)碼點(diǎn)的序列。在Unicode文本和其他字符編碼文本間的轉(zhuǎn)換一般是通過明確的表映射過程完成的,。
2.4 Unicode的碼點(diǎn),、編碼格式、編碼方案
2.4.1 Unicode編碼空間和碼點(diǎn)
在Unicode標(biāo)準(zhǔn)中,,編碼空間的整數(shù)范圍是從0到10FFFF(16進(jìn)制),,共1,114,112個(gè)可用的碼點(diǎn)。
為了與已有的編碼標(biāo)準(zhǔn)兼容,,一些抽象字符可能會(huì)與多個(gè)分別編碼的字符關(guān)聯(lián),。而在其他一些情況下,一個(gè)抽象字符可能會(huì)用兩個(gè)(或更多)編碼字符序列來表示,,如帶重音符的字母,。
2.4.2 Unicode編碼格式
在Unicode字符編碼模型中,編碼格式(encoding form)指定如何將每個(gè)碼點(diǎn)表示為一個(gè)或多個(gè)編碼單元序列,。Unicode標(biāo)準(zhǔn)提供了三種不同的編碼格式,,使用8位、16位和32位編碼單元,,分別為UTF-8,、UTF-16、UTF-32,。
(1)UTF-32
UTF-32是一種最簡(jiǎn)單的Unicode編碼格式,。每個(gè)Unicode碼點(diǎn)被直接表示為一個(gè)32位的編碼單元。UTF-32是一種固定寬度的字符編碼格式,。
每個(gè)UTF-32編碼單元的值與Unicode碼點(diǎn)的值完全相同,。
(2)UTF-16
在UTF-16中,在范圍U+0000到U+FFFF間的碼點(diǎn)使用一個(gè)單一的16位編碼單元表示,;而,在范圍U+10000到U+10FFFF間的碼點(diǎn)則使用一對(duì)16位編碼單元表示,,稱作代理對(duì)(surrogate pair),。
UTF -16優(yōu)化了基本多語言平面(Basic Multilingual Plane)中字符的表示,即位于U+0000到U+FFFF范圍內(nèi)的字符,。該范圍包含了目前世界上所使用的書寫系統(tǒng)中的絕大多數(shù)字符,,每個(gè)字符只需要一 個(gè)16位的編碼單元。對(duì)于基本多語言平面,,UTF-16可作為固定寬度的編碼格式來有效使用,。
但對(duì)于增補(bǔ)字符,,UTF-16需要兩個(gè)16位的編碼單元,意味著正式的UTF-16是一個(gè)變寬的編碼格式,。
UTF-16是早期Unicode遺留下的歷史產(chǎn)物,,原本被設(shè)計(jì)成具有固定寬度的16位編碼格式。為支持超過U+FFFF的增補(bǔ)字符,,設(shè)立了代理機(jī)制,。
(3)UTF-8
為滿足基于ASCII,面向字節(jié)的系統(tǒng)的需要,,Unicode標(biāo)準(zhǔn)中定義了第三種編碼格式UTF-8,。它是一種使用8位編碼單元的變寬的編碼格式。
在UTF-8的編碼單元種,,一些高位用于指示當(dāng)前字節(jié)在編碼單元序列中的那一部分,。8位編碼單元的取值的一部分范圍保留給UTF-8的編碼單元序列的首字節(jié);另一部分完全奮力的范圍保留給序列中的后續(xù)字節(jié),,以保證UTF-8不重疊,。
UTF -8編碼格式對(duì)所有ASCII碼點(diǎn)具有透明性。在U+0000到U+007F范圍內(nèi)的Unicode碼點(diǎn),,被轉(zhuǎn)換為UTF-8中單一的字節(jié)0x00到 0x7F,,與ASCII碼沒有區(qū)別。并且,,從0x00到0x7F不會(huì)出現(xiàn)在其他Unicode碼點(diǎn)的UTF-8表示中的任一字節(jié)中,,保證了不存在歧義。
Unicode中超出ASCII范圍的其他一些非表意字母,,每個(gè)都在UTF-8種使用量各字節(jié)表示,;位于U+0800到U+FFFF范圍內(nèi)的非代理碼點(diǎn)使用三字節(jié)表示;超出U+FFFF的增補(bǔ)碼點(diǎn)則需要四字節(jié)表示,。
UTF-8是Internet中HTML和類似協(xié)議偏好的編碼格式,。
UTF-8同其他的多字節(jié)編碼方式相比具有以下特點(diǎn):
a) UTF-8的編碼單元序列的第一個(gè)字節(jié)指明了后面所跟的字節(jié)的數(shù)目。對(duì)前向解析非常有效,。
b) 從UTF-8字節(jié)流的任意位置開始可以有效的找到一個(gè)字符的其實(shí)位置,。
c) UTF-8中不存在字節(jié)取值的重疊。
2.4.3 Unicode編碼方案
在Unicode標(biāo)準(zhǔn)中,,用于Unicode數(shù)據(jù)字節(jié)串行化的各種不同類型的規(guī)范被稱為Unicode編碼方案(encoding scheme),。
在計(jì)算機(jī)系統(tǒng)中,大數(shù)值類型(如整型)使用多個(gè)字節(jié)表示,,不同體系結(jié)構(gòu)采用的字節(jié)排列順序不同,。其中,,部分采用由高字節(jié)到低字節(jié)的排列順序,,稱為big-endian,;其他則采用由低字節(jié)到高字節(jié)的排列順序,稱little-endian,。
對(duì)于UTF-16和UTF-32,,字節(jié)串行化規(guī)范必須考慮當(dāng)前表示數(shù)據(jù)的系統(tǒng)采用的是big-endian還是little-endian結(jié)構(gòu)。
一個(gè)字符編碼方案包括指定的字符編碼格式,,以及如何將編碼單元串行化為字節(jié)的規(guī)范,。在Unicode標(biāo)準(zhǔn)中,,還規(guī)定了初始的字節(jié)順序標(biāo)志(byte order mark, BOM)的使用,用于顯示區(qū)分big-endian和little-endian數(shù)據(jù),。
對(duì)于UTF-8,,在序列中只包括UTF-8的編碼單元(1字節(jié)),,因此,,UTF-8中的數(shù)據(jù)表示不存在字節(jié)順序的問題,。但對(duì)于16位和32位的編碼方案,字節(jié)串行化過程必須將編碼單元分解為兩個(gè)或四個(gè)字節(jié),,并且必須清楚的定義這些字節(jié)的順序,。
因此,Unicode標(biāo)準(zhǔn)中定義的三種編碼格式,,導(dǎo)致總共七種Unicode編碼方案,,分別為:UTF-8,、UTF-16,、UTF-16BE、UTF-16LE,、UTF-32,、UTF-32BE、UTF-32LE,。
必須明確,,字符編碼格式(character encoding form)指在內(nèi)存或API中的整數(shù)數(shù)據(jù)單元,與字節(jié)順序不相關(guān),;字符編碼方案(character encoding scheme)指字節(jié)串行化的數(shù)據(jù),如I/O流或者文件,,必須制定字節(jié)順序。
2.4.4 Unicode編碼空間分配
根據(jù)在語言學(xué)上和功能上的類別,,Unicode標(biāo)準(zhǔn)中的編碼字符被分成組,。
Unicode 編碼空間的范圍為0到10FFFF,可以被劃分為字符平面(planes of characters),,每個(gè)平面包含64K各碼點(diǎn)。因此,,最底層的平面為基本多語言平面(Basic Multilingual Plane),包括范圍從0000到FFFF,;下一個(gè)平面為增補(bǔ)多語言平面(Supplementary Multilingual Plane),也被稱為第一平面(Plane 1),,包括范圍10000到1FFFF,;以及,第二平面(Plane 2),,增補(bǔ)表意字符平面(Supplementary Ideographic Plane),,包括范圍20000到2FFFF;等等,?;径嗾Z言平面有時(shí)也被稱為Plane 0。
基本多語言平面(BMP, or Plane 0)包含目前世界上使用的所有書寫系統(tǒng)中的全部常用字符,,以及一些歷史上的不常用字符,。
增補(bǔ)多語言平面(SMP, or Plane 1)用于一些較少使用的歷史上的書寫系統(tǒng),針對(duì)特殊目的創(chuàng)建的書寫系統(tǒng),,和特殊的標(biāo)記系統(tǒng),,它們要么無法放入基本多語言平面中,要么特別不常用,。
增補(bǔ)表意字符平面(SIP, or Plane 2)用于無法放入基本語言平面眾所分配區(qū)域中/日/韓字符(CJK character),。盡管在SIP中包含少量的常用CJK字符(例如,用于粵語),,其中絕大多數(shù)字符是僅具有歷史意義的不常用字符,。
增補(bǔ)專用平面(Supplementary Special-purpose Plane, SSP, or Plane 14)用于無法放入基本多語言平面眾所分配區(qū)域的格式控制字符。
3. 一致性
符合Unicode一致性要求的實(shí)現(xiàn)必須滿足本部分定義的標(biāo)準(zhǔn),,以便與其他規(guī)范的實(shí)現(xiàn)進(jìn)行交互,。
3.1 一致性要求
3.1.1 未分配的碼點(diǎn)(Unassigned Code Points)
C4 處理過程不應(yīng)該把高代理碼點(diǎn)(high-surrogate code point)或者低代理碼點(diǎn)(low-surrogate code point)解釋為抽象字符。
C5 處理過程不應(yīng)該把非字符碼點(diǎn)解釋為抽象字符,。
C6 處理過程不應(yīng)該將未分配的碼點(diǎn)解釋為抽象字符,。
3.1.2解釋(Interpretation)
C7 如果處理過程要解釋編碼字符的表示,就必須根據(jù)標(biāo)準(zhǔn)中確立的字符語義進(jìn)行解釋,。
C8 不要求處理過程對(duì)任何特定的編碼字符都作解釋,。
  允許處理過程只解釋Unicode字符中的一個(gè)子集;不需要解釋所有Unicode字符,。
  標(biāo)準(zhǔn)中不涉及任何指定字符子集的方法,。
  標(biāo)準(zhǔn)中不涉及自定義區(qū)中碼點(diǎn)的語義,。
C9 處理過程不應(yīng)認(rèn)為對(duì)兩個(gè)具有規(guī)范等價(jià)性字符序列(canonical-equivalent character sequence)的解釋會(huì)不同。
  該條款包含兩層意義:(一)處理過程不應(yīng)該對(duì)兩個(gè)不同但又具有規(guī)范等價(jià)性的字符序列由不同的解釋,;(二)任何處理過程不應(yīng)假設(shè)其他處理過程會(huì)對(duì)兩個(gè)不同但具有規(guī)范等價(jià)性的字符序列進(jìn)行不同的解釋,。
3.1.3 修改(Modification)
C10 如果一個(gè)處理過程聲稱不會(huì)修改對(duì)一個(gè)正確的編碼字符表示的解釋,則它不能對(duì)編碼字符的表示進(jìn)行任何修改,,除非是用具有規(guī)范等價(jià)性的字符序列進(jìn)行替換,,或者是刪除非字符的碼點(diǎn)。
  用具有規(guī)范等價(jià)性的字符序列替換原有字符序列不會(huì)修改對(duì)文本的解釋,。
  替換或者刪除處理過程不能會(huì)不進(jìn)行解釋的字符序列,,不修改對(duì)文本的解釋。
  當(dāng)在不同計(jì)算機(jī)體系結(jié)構(gòu)間轉(zhuǎn)換字符序列時(shí),,對(duì)字符序列位或者字節(jié)順序的改變,,不修改對(duì)文本的解釋。
  將一個(gè)正確的編碼字符的表示從一種Unicode字符編碼格式轉(zhuǎn)換為另一種編碼格式時(shí),,不修改對(duì)文本的解釋,。
  將編碼單元序列的字節(jié)串行化從一種Unicode字符編碼方案轉(zhuǎn)換為另一種編碼方案時(shí),不修改對(duì)文本的解釋,。
  如果在處理過程中意外遇到一個(gè)沒有明確內(nèi)部用途的非字符,,在實(shí)現(xiàn)中可以發(fā)出錯(cuò)誤,或者刪除或忽略該非字符,。如果沒有采取這些選擇,,這個(gè)非字符應(yīng)該被作為一個(gè)為分配的碼點(diǎn)。
3.1.4 字符編碼格式(Character Encoding Forms)
C11 當(dāng)處理過程對(duì)一個(gè)聲稱以某種Unicode字符編碼格式存在的編碼單元序列進(jìn)行解釋時(shí),,必須按照相應(yīng)的碼點(diǎn)序列進(jìn)行解釋,。
C12 當(dāng)處理過程以某種Unicode字符編碼格式生成編碼單元序列時(shí),不應(yīng)生成形式錯(cuò)誤(ill-formed)的編碼單元序列,。
C12a 當(dāng)處理過程對(duì)一個(gè)聲稱以某種Unicode字符編碼格式存在的編碼單元序列進(jìn)行解釋時(shí),,應(yīng)該將形式錯(cuò)誤的編碼單元序列看作錯(cuò)誤條件,而不能將序列解釋為字符,。
3.1.5 字符編碼方案(Character Encoding Schemes)
C12b 當(dāng)處理過程對(duì)一個(gè)具有某種Unicode字符編碼方案的字節(jié)序列進(jìn)行處理時(shí),,應(yīng)該根據(jù)字節(jié)順序和標(biāo)準(zhǔn)中針對(duì)字符編碼方案設(shè)立的字節(jié)順序標(biāo)記(byte order mark)使用規(guī)范,進(jìn)行解釋,。
3.1.6 雙向文本(Bidirectional Text)
C13 用于顯示包含從右到左的字符文本的處理過程,,當(dāng)沒有高層協(xié)議時(shí),必須以對(duì)文本應(yīng)用雙向算法后同樣的順序顯示所有具有可見表示的字符(不包括格式字符),。
3.1.7 正規(guī)化形式(Normalization Forms)
C14 以某種正規(guī)化形式生成Unicode文本的處理過程,,必須與Unicode Standard Annex #15 "Unicode Normalization Forms"中定義的規(guī)范相符合。
C15 測(cè)試Unicode文本是否具有某種正規(guī)化形式的處理過程,必須與必須與Unicode Standard Annex #15中定義的規(guī)范相符合,。
C16 將文本轉(zhuǎn)換為某種正規(guī)化形式的處理過程必須生成Unicode Standard Annex #15中規(guī)定的結(jié)果,。
3.1.8 標(biāo)準(zhǔn)的引用(Normative References)
C17 對(duì)標(biāo)準(zhǔn)、屬性別名,、屬性值別名或者Unicode算法的標(biāo)準(zhǔn)引用,必須依照Unicode標(biāo)準(zhǔn)種指定的格式,。
C18 高層協(xié)議不能對(duì)臨時(shí)屬性進(jìn)行標(biāo)準(zhǔn)引用,。
3.1.9 Unicode算法(Unicode Algorithms)
C19 如果處理過程聲稱實(shí)現(xiàn)某個(gè)Unicode算法,則必須符合標(biāo)準(zhǔn)中定義的算法規(guī)范,,除非被高層協(xié)議改變,。
3.2 術(shù)語定義
以下是對(duì)一致性條款中所使用術(shù)語的準(zhǔn)確定義。
3.2.1 字符的身份和語義(Character Identity and Semantics)
D1 標(biāo)準(zhǔn)的行為(normative behavior):Unicode標(biāo)準(zhǔn)中的標(biāo)準(zhǔn)行為包括以下列表,,以及在一致性條款種指定的其他行為,。
1. 字符組合;
2. 規(guī)范化的分解,;
3. 兼容的分解,;
4. 規(guī)范的排序行為;
5. 雙向行為,;
6. 聯(lián)合jamo行為(conjoining jamo behavior);
7. 變化選擇,;
8. 正規(guī)化。
D2a 字符身份(character identity):一個(gè)字符的身份是由它的字符名稱,、表示的字形確定的,。
D2b 字符語義(character semantics):一個(gè)字符的語義是由它的身份、標(biāo)準(zhǔn)的屬性和行為決定的,。
3.2.2 字符與編碼(Characters and Encoding)
D3 抽象字符(abstract character):信息的單元,,用于文本數(shù)據(jù)的組織、控制或表示,。
  抽象字符沒有具體的形狀,,不應(yīng)與字形混淆。
  Unicode標(biāo)準(zhǔn)中沒有直接編碼的抽象字符經(jīng)??梢允褂媒M合字符序列表示,。
D4 抽象字符序列:抽象字符的有序序列。
D4a Unicode編碼空間(Unicode codespace):從0到10FFFF的整數(shù)空間(十六進(jìn)制),。
D4b 碼點(diǎn)(code point):Unicode編碼空間中的任何一個(gè)整數(shù)值,。
  一個(gè)碼點(diǎn)也稱為一個(gè)編碼位置。
D5 編碼字符(encoded character):在一個(gè)抽象字符和一個(gè)碼點(diǎn)間的關(guān)聯(lián),。
  在Unicode中,,為了與其它標(biāo)準(zhǔn)兼容,一個(gè)單個(gè)的抽象字符可能與多個(gè)碼點(diǎn)對(duì)應(yīng)。
  一個(gè)單個(gè)的抽象字符也可能使用一個(gè)碼點(diǎn)序列表示,。
D6 編碼字符表示(coded character representation):一個(gè)碼點(diǎn)序列,。通常,是由編碼字符的序列組成,,但也可能包含非字符或保留的碼點(diǎn),。
  編碼字符表示也稱為編碼字符序列(coded character sequence)。
  在內(nèi)部,,處理過程可能會(huì)在編碼字符表示中使用非字符碼點(diǎn),。但是,這些非字符碼點(diǎn)可能不會(huì)被解釋成抽象字符,;并且,,如果這些非字符碼點(diǎn)被具有一致性的處理過程刪除,不構(gòu)成對(duì)編碼字符表示解釋的修改,。
D7a 不贊成使用的字符(deprecated character):強(qiáng)烈不鼓勵(lì)使用的編碼字符,。
  在標(biāo)準(zhǔn)中保留不贊成使用的字符,以便使以前相容的數(shù)據(jù)仍然與今后的Unicode標(biāo)準(zhǔn)保持一致性,。
D7b 非字符(noncharacter):被永久保留做內(nèi)部使用的碼點(diǎn),,不應(yīng)用于交換。非字符包括值U+nFFFE和U+nFFFF(n表示十六進(jìn)制整數(shù)從0到10),,以及值從U+FDD0到U+FDEF,。
D7c 保留的碼點(diǎn)(reserved code point):Unicode標(biāo)準(zhǔn)中保留的,用于今后分配的碼點(diǎn),。也稱為位分配碼點(diǎn)(unassigned code point),。
  代理碼點(diǎn)和非字符碼點(diǎn)是已分配的碼點(diǎn),但不是分配給字符,。
D8 高層協(xié)議(higher-level protocol):任何超出Unicode標(biāo)準(zhǔn)范圍,,對(duì)Unicode字符進(jìn)行解釋協(xié)議。
D8a Unicode算法(Unicode Algorithm):對(duì)處理過程的邏輯描述,,用于獲得涉及Unicode字符的指定結(jié)果,。
3.2.3 屬性(Properties)
(1)標(biāo)準(zhǔn)的和指示性屬性(Normative and Informative Properties)
Unicode字符屬性可以分為標(biāo)準(zhǔn)的和指示性的。
D9 標(biāo)準(zhǔn)屬性(normative property):Unicode字符屬性,,它的取值必須為與標(biāo)準(zhǔn)相一致,。
D9a 指示性屬性(Informative property):Unicode字符屬性,它的取值僅僅是為了提供更多信息,。
D9b 臨時(shí)的屬性(provisional property):Unicode字符屬性,,它的取值未被批準(zhǔn)、試驗(yàn)性的,,也可能是不完全的,。
(2)簡(jiǎn)單的和衍生出的屬性(Simple and Derived Properties)
D9c 簡(jiǎn)單屬性(simple property):Unicode字符屬性,,它的取值在UCD,the Unicode Character Database(或標(biāo)準(zhǔn)中的其他地方)直接指定,,并且它的取值無法從其他簡(jiǎn)單屬性中衍生出來,。
D9d 衍生屬性(derived property):Unicode字符屬性,它的取值可通過算法從一些簡(jiǎn)單屬性的組合中衍生出來,。
(3)屬性別名(Property Aliases)
D10 屬性別名(property alias):特定Unicode字符屬性的一個(gè)唯一標(biāo)示名,。
  用于屬性別名的標(biāo)示名中僅包含ASCII中的字母、數(shù)字和下劃線,。
  為每個(gè)屬性別名分別定義了長(zhǎng),、短兩種形式的名稱。短的形式一般只有兩個(gè)或三個(gè)字符長(zhǎng),,便于在標(biāo)記語言中用于標(biāo)記屬性。
D10a 屬性值別名(property value alias):為Unicode字符屬性的特定取值定義的唯一標(biāo)示名,。
  用于屬性值別名的標(biāo)示名中僅包含ASCII中的字母,、數(shù)字和下劃線,或者是特殊的值"n/a",。
  為每個(gè)屬性值別名分別定義了長(zhǎng),、短兩種形式的名稱。
  屬性值別名僅在相關(guān)聯(lián)的特定屬性環(huán)境中唯一,。
(4)卻省屬性值(Default Property Value)
D11 卻省屬性值(default property value):針對(duì)一個(gè)給定的Unicode屬性,,用于指派給未分配的碼點(diǎn)或沒有明確指定其他屬性值的屬性值。
(5)私用(Private Use)
D12 私用碼點(diǎn)(private-use code point):在范圍U+E000到U+F8FF,、U+F0000到U+FFFFD和U+100000到U+10FFFD內(nèi)的碼點(diǎn),。
  私用碼點(diǎn)被認(rèn)為已分配給字符,但標(biāo)準(zhǔn)中沒有指定對(duì)私用碼點(diǎn)相關(guān)聯(lián)的抽象字符的解釋,。
  私用碼點(diǎn)可能會(huì)被賦予卻省的屬性值,,但這些卻省值可以被對(duì)私用碼點(diǎn)進(jìn)行解釋的高層協(xié)議替換。
3.2.4 組合(Combination)
D13 基字符(base character):在書寫上,,不與前面的字符進(jìn)行組合的字符,,它既不是控制字符也不是格式字符。
D14 組合字符(combining character):在書寫上,,與前面的基字符進(jìn)行組合的字符,。稱組合字符應(yīng)用于基字符。
  組合字符不單獨(dú)使用,。它們包括重音符,、變音符、希伯萊文中的點(diǎn),、阿拉伯文元音符號(hào)等,。
  盡管組合字符用來與基字符組合顯示的,但可能出現(xiàn)兩種情況(1)在組合字符前沒有基字符;(2)處理過程無法執(zhí)行組合操作,。在這兩種情況下,,處理過程可能會(huì)不進(jìn)行書寫上的合并而顯示組合字符。
  在編碼表中,,組合字符的表示使用虛線圓圈描繪,。當(dāng)與前面的基字符組合顯示時(shí),基字符要出現(xiàn)在虛線圓圈的位置上,。
  組合字符一般具有它們的基字符的屬性,,同時(shí)保留它們的組合屬性。
  控制字符和格式字符,,如tab和right-left mark不是基字符,。
D15 非間距標(biāo)記(nonspacing mark):在顯示時(shí),位置取決于基字符的組合字符,。這些字符一般在可視基線上不占用空間,。
  這些字符可能會(huì)很大,影響它們的基字符相對(duì)于前后基字符的放置,。
D16 間距標(biāo)記(spacing mark):不是非間距標(biāo)記的組合字符,。
  一般來說,間距標(biāo)記的行為與基字符沒有太大區(qū)別,。
D17 組合字符序列(combining character sequence):一個(gè)字符序列,,由一個(gè)基字符后跟了一個(gè)或多個(gè)組合字符組成,或者是一個(gè)或多個(gè)組合字符的組成的序列,。
D17a 不良的組合字符序列(defective combining character sequence):一個(gè)不是以基字符開始的組合字符序列,。
  當(dāng)組合字符序列出現(xiàn)在串的開始位置,或者跟在控制字符或格式字符后出現(xiàn)時(shí),,產(chǎn)生不良的組合字符序列,。
3.2.5 分解(Decomposition)
D18 可分解字符(decomposable character):根據(jù)分解映像表,與一個(gè)或多個(gè)字符組成的序列等價(jià)的字符,。也被稱作預(yù)組合字符(precomposed character)或復(fù)合字符(composite character),。
D19 分解(decomposition):與一個(gè)可分解字符等價(jià)的一個(gè)或多個(gè)字符組成的序列。一個(gè)字符序列的完全分解,,是對(duì)序列中每個(gè)字符進(jìn)行分解直到?jīng)]有字符可以進(jìn)一步分解,。
(1)兼容的分解(Compatibility Decomposition)
D20 兼容的分解(compatibility decomposition):遞歸應(yīng)用Character Names List中的兼容映像表和規(guī)范映像表,以及Conjoining Jamo Behavior中的定義,,對(duì)字符進(jìn)行分解,,直到?jīng)]有任何字符可以進(jìn)一步分解,并根據(jù)Canonical Ordering Behavior中的定義對(duì)非間距標(biāo)記進(jìn)行重新排序,。
D21 兼容的可分解字符(compatibility decomposable character):兼容分解的結(jié)果與規(guī)范分解結(jié)果不相同的字符,。
(2)規(guī)范的分解(Canonical Decomposition)
D23 規(guī)范的分解(canonical decomposition):遞歸應(yīng)用Character Names List中的規(guī)范映像表,,以及Conjoining Jamo Behavior中的定義,對(duì)字符進(jìn)行分解,,直到?jīng)]有任何字符可以進(jìn)一步分解,,并根據(jù)Canonical Ordering Behavior中的定義對(duì)非間距標(biāo)記進(jìn)行重新排序。
D21 規(guī)范的可分解字符(compatibility decomposable character):與規(guī)范分解結(jié)果不相同的字符,。
D24 規(guī)范等價(jià)性(canonical equivalent):如果兩個(gè)字符序列的完全規(guī)范分解結(jié)果相同,,稱它們具有規(guī)范的等價(jià)性。
3.2.6 代理(Surrogates)
D25 高代理碼點(diǎn)(high-surrogate code point):位于范圍U+D800到U+DBFF內(nèi)的Unicode碼點(diǎn),。
D25a 高代理編碼單元(high-surrogate code unit):在范圍D800到DBFF內(nèi)的16位編碼單元,,作為UTF-16中代理對(duì)的起始編碼單元。
D26 低代理碼點(diǎn)(low-surrogate code point):位于范圍U+DC00到U+DFFF內(nèi)的Unicode碼點(diǎn),。
D26a 低代理編碼單元(low-surrogate code unit):在范圍DC00到DFFF內(nèi)的16位編碼單元,,作為UTF-16中代理對(duì)的結(jié)尾編碼單元。
D27 代理對(duì)(surrogate pair):由兩個(gè)16位編碼單元組成的序列來表示單個(gè)的抽象字符,,其中,,代理對(duì)的第一部分為高代理編碼單元,第二部分為低代理編碼單元,。
  代理對(duì)僅用于UTF-16。
  孤立的代理編碼單元自身沒有解釋,。
3.2.7 Unicode編碼格式(Unicode Encoding Forms)
D28 Unicode標(biāo)量值(Unicode scalar value):除了高代理和低代理碼點(diǎn)外的其他所有Unicode碼點(diǎn),。
D28a 編碼單元(code unit):為了處理和交換,表示編碼文本單元的最小的位組合,。
  編碼單元是計(jì)算機(jī)存儲(chǔ)中的特定單元,。Unicode標(biāo)準(zhǔn)在UTF-8中使用8位編碼單元,在UTF-16中使用16位編碼單元,,在UTF-32中使用32位編碼單元,。
  在Unicode標(biāo)準(zhǔn)中,一些編碼單元的特定值不能單獨(dú)用于表示編碼字符,。該限制條件應(yīng)用于UTF-16中孤立的代理碼點(diǎn),,以及UTF-8中的字節(jié)80-FF。
D28b 編碼單元序列(code unit sequence):一個(gè)或多個(gè)編碼單元的有序序列,。
  當(dāng)編碼單元是8位時(shí),,編碼單元序列也可被稱作字節(jié)序列。
  一個(gè)編碼單元序列可能只有一個(gè)單個(gè)的編碼單元,。
  在程序設(shè)計(jì)語言中,,字符串類型的值基本由編碼單元序列組成。
  依賴字符編碼標(biāo)準(zhǔn)的結(jié)構(gòu),,可能要使用編碼單元序列(包含多個(gè)編碼單元)來表示一個(gè)單個(gè)的編碼字符,。
D29 Unicode編碼格式將每個(gè)Unicode標(biāo)量值分配給一個(gè)唯一的編碼單元序列,。
  由于歷史原因,Unicode編碼格式也被稱作Unicode(or UCS) transformation formats(UTF),。
  在Unicode標(biāo)量值集合與針對(duì)Unicode編碼格式的編碼序列集合間的映射是一對(duì)一的,。
  對(duì)給定的編碼格式,存在編碼單元序列沒有相關(guān)聯(lián)的Unicode標(biāo)量值,。
D29a Unicode串(Unicode string):由Unicode編碼格式中編碼單元組成的編碼單元序列,。
D29b 8位Unicode串(Unicode 8-bit string):只包含UTF-8編碼單元的Unicode串。
D29c 16位Unicode串(Unicode 16-bit string):只包含UTF-16編碼單元的Unicode串,。
D29d 32位Unicode串(Unicode 32-bit string):只包含UTF-32編碼單元的Unicode串,。
D30 形式不良的(ill-formed):如果具有Unicode編碼格式的Unicode編碼單元序列沒有遵照Unicode編碼格式規(guī)范,就稱為形式不良的,。
  如果編碼單元序列對(duì)應(yīng)的碼點(diǎn)位與Unicode標(biāo)量范圍之外,,就是形式不良的。
  UTF-8對(duì)起始字節(jié)和后續(xù)字節(jié)的字節(jié)范圍有嚴(yán)格的約束,。違反這些約束,,將使生成的編碼單元序列無法映射到Unicode標(biāo)量值上,產(chǎn)生一個(gè)形式不良的編碼單元序列,。
D30a 形式良好的(well-formed):遵照Unicode編碼格式規(guī)范的Unicode編碼單元序列,,就成為形式良好的。
D30b 形式良好的UTF-8編碼單元序列(well-formed UTF-8 code unit sequence)
D30c 形式良好的UTF-16編碼單元序列(well-formed UTF-16 code unit sequence)
D30d 形式良好的UTF-32編碼單元序列(well-formed UTF-32 code unit sequence)
D30e 具有Unicode編碼格式(in a Unicode encoding form):如果一個(gè)Unicode串是由某個(gè)特定的Unicode編碼格式的形式良好的編碼單元序列組成,,稱該Unicode字符串具有Unicode編碼格式,。
UTF-32
D31 UTF-32編碼格式(UTF-32 encoding form):一種Unicode編碼格式,為每個(gè)Unicode標(biāo)量值分配一個(gè)單一的無符號(hào)的32位編碼單元,,編碼單元的數(shù)字值與Unicode標(biāo)量值相同,。
  因?yàn)榇泶a點(diǎn)沒有包括在Unicode標(biāo)量值集合中,所以位與范圍0000D800到0000DFFF間的UTF-32編碼單元使形式不良的,。
  任何大于0010FFFF的UTF-32編碼單元是形式不良的,。
UTF-16
D35 UTF-16編碼格式(UTF-16 encoding form):一種Unicode編碼格式,為處在范圍U_0000到U+D7FF和U+E000到U+FFFF內(nèi)的每個(gè)Unicode標(biāo)量值分配一個(gè)單一 的無符號(hào)的16位編碼單元,,編碼單元的數(shù)字值與Unicode標(biāo)量值相同,;位處在范圍U+10000到U+10FFFF內(nèi)的每個(gè)Unicode標(biāo)量值分配 一個(gè)代理對(duì)。
  因?yàn)榇泶a點(diǎn)不是Unicode標(biāo)量值,,位于范圍D800到DFFF間單獨(dú)的UTF-16編碼單元是形式不良的,。
UTF-16 Bit Distribution
Scalar Value UTF-16
xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
000uuuuuxxxxxxxxxxxxxxxx 110110wwwwxxxxxx110111xxxxxxxxxx
wwww=uuuuu-1
UTF-8
D36 UTF-8編碼格式(UTF-8 encoding form):一種Unicode編碼格式,位每個(gè)Unicode標(biāo)量值分配一個(gè)由一到四個(gè)無符號(hào)字節(jié)組成的序列,。
UTF-8 Bit Distribution
Scalar Value 1st Byte 2nd Byte 3rd Byte 4th Byte
00000000 0xxxxxxx 0xxxxxxx
00000yyy yyxxxxxx 110yyyyy 10xxxxxx
zzzzyyyy yyxxxxxx 1110zzzz 10yyyyyy 10xxxxxx
000uuuuu zzzzyyyy yyxxxxxx 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx
編碼格式轉(zhuǎn)換(Encoding Form Conversion)
D37 編碼格式轉(zhuǎn)換:在一種Unicode編碼格式的編碼單元序列與另一種Unicode編碼格式的編碼單元序列間,,直接定義的轉(zhuǎn)換。
   * 在Unicode標(biāo)準(zhǔn)實(shí)現(xiàn)中,,一個(gè)典型的API在邏輯上,,將輸入的編碼單元序列轉(zhuǎn)化為Unicode標(biāo)量值(碼點(diǎn)),,然后將標(biāo)量值轉(zhuǎn)化為輸出的編碼單元序列。然而,,可以直接在不同編碼格式間進(jìn)行轉(zhuǎn)換,,以獲取更高的效率。
   * 具有一致性的編碼格式轉(zhuǎn)換過程應(yīng)將任何形式不良的編碼單元序列作為一個(gè)錯(cuò)誤條件,。
3.2.8 Unicode編碼方案(Unicode Encoding Schemes)
D38 Unicode編碼方案:針對(duì)Unicode編碼格式的一種指定的字節(jié)串行換,,也可包括處理字節(jié)順序標(biāo)記(byte order mark, BOM)的規(guī)范。
D39 UTF-8編碼方案(UTF-8 encoding scheme):對(duì)UTF-8編碼單元序列進(jìn)行串行化的Unicode編碼方案,,字節(jié)序列與編碼單元序列本身完全一致,。
D40 UTF-16BE編碼方案(UTF-16BE encoding scheme):將UTF-16編碼單元序列串行化為big-endian格式字節(jié)序列的Unicode編碼方案。
D41 UTF-16LE編碼方案(UTF-16LE encoding scheme):將UTF-16編碼單元序列串行化為little-endian格式字節(jié)序列的Unicode編碼方案,。
D42 UTF-16編碼方案(UTF-16 encoding scheme):將UTF-16編碼單元序列串行化為big-endian或者little-endian格式字節(jié)序列的Unicode編碼方案,。
  在UTF-16編碼方案中,與U+FEFF對(duì)應(yīng)的初始字節(jié)序列,,被解釋為字節(jié)順序標(biāo)記(BOM),,用于區(qū)分兩種字節(jié)順序。初始字節(jié)順序表明是big-endian順序,,表明是little-endian順序,。BOM不是文本內(nèi)容的一部分。
  UTF-16編碼方案可能以BOM開始,,也可能沒有,。然而,如果沒有BOM,,也沒有高層協(xié)議指示,,UTF-16編碼方案的字節(jié)順序?yàn)閎ig-endian,。
D43 UTF-32BE編碼方案(UTF-32BE encoding scheme):將UTF-32編碼單元序列串行化為big-endian格式字節(jié)序列的Unicode編碼方案,。
D44 UTF-32LE編碼方案(UTF-16LE encoding scheme):將UTF-32編碼單元序列串行化為little-endian格式字節(jié)序列的Unicode編碼方案。
D45 UTF-32編碼方案(UTF-32 encoding scheme):將UTF-32編碼單元序列串行化為big-endian或者little-endian格式字節(jié)序列的Unicode編碼方案,。
  在UTF-32編碼方案中,,與U+FEFF對(duì)應(yīng)的初始字節(jié)序列,被解釋為字節(jié)順序標(biāo)記(BOM),,用于區(qū)分兩種字節(jié)順序,。初始字節(jié)順序<00 00 FE FF>表明是big-endian順序,表明是little-endian順序,。BOM不是文本內(nèi)容的一部分,。
  UTF-32編碼方案可能以BOM開始,也可能沒有,。然而,,如果沒有BOM,,也沒有高層協(xié)議指示,UTF-16編碼方案的字節(jié)順序?yàn)閎ig-endian,。
3.2.9規(guī)范排序行為(Canonical Ordering Behavior)
用于對(duì)組合字符序列提供無歧義的解釋,,以便能按照可預(yù)知的方式創(chuàng)建和交換包含組合字符的序列。正規(guī)化是規(guī)范排序行為的另一個(gè)重要應(yīng)用,。
在Unicode標(biāo)準(zhǔn)中,,組合字符序列中字符的順序按照以下原則解釋:
  所有組合字符必須跟在所應(yīng)用的基字符后面。
  封閉的標(biāo)記(enclosing mark)將包圍基字符以及標(biāo)記之前的所有組合字符,。也包圍它之前的其他封閉標(biāo)記,。
  double diacritic的結(jié)合程度比其他非間距標(biāo)記(nonspacing mark)要松。當(dāng)顯示時(shí),,double diacritic的位置在其他變音符之上,,不包括封閉的變音符。
  具有相同組合類別(combining class)的組合標(biāo)記在書寫上的位置一般是由所修飾的基字符向外排列,。一些特定的非間距標(biāo)記將改變卻省的排列行為,,與相鄰的非間距標(biāo)記并行排列。當(dāng)并行排列時(shí),,編碼的順序與書寫中占支配的順序有關(guān),。
  如果組合字符的組合類別不同,將不會(huì)有顯示形式或語義上的差別,。
(1)組合類別(Combining Class)
D46 組合類別:分配給每個(gè)Unicode組合字符的數(shù)字值,,用于確定與那些組合字符在排字上相互作用。
  如果組合字符間在排字上相互作用,,則具有相同的組合類別,;否則,具有不同類別,。
  封閉字符和間距組合字符的組合類別與它們的基字符相同,。
  組合類別具有的特定數(shù)字沒有特別的重要性,只是用來比較是否相等,,區(qū)分不同的組合類別,。
(2)規(guī)范排序(Canonical Ordering)
對(duì)一個(gè)被分解的字符序列的規(guī)范排序,是根據(jù)組合類別對(duì)每個(gè)組合字符序列進(jìn)行排序來完成的,。字符序列的規(guī)范排序不反映任何語言正確性或偏好,。
對(duì)被分解的字符序列D進(jìn)行規(guī)范排序的算法為:
R1 對(duì)D中的任意字符x,定義p(x)為字符x的組合類別,。
R2 如果在D中存在想的字符對(duì)(A,B),,并且p(B)不為零,p(A)>p(B),,則交換兩個(gè)字符,。
R3 重復(fù)執(zhí)行R2,,直到在D中沒有發(fā)生任何交換。
(3)Conjoining Jamo Behavior
在Unicode標(biāo)準(zhǔn)中包含了一套預(yù)組合的Hangual音節(jié),,以及一套用于表示古老的韓文音節(jié)和現(xiàn)代韓文音節(jié)的jamo,。
4. 實(shí)現(xiàn)指南
4.1 編碼轉(zhuǎn)換(Transcoding to Other Standards)
一般,在Unicode標(biāo)準(zhǔn)和其他編碼標(biāo)準(zhǔn)間的映射需要通過表(table)來完成,,而不是算法轉(zhuǎn)換,。使用表查找常常具有比簡(jiǎn)單算法轉(zhuǎn)換更高的效率。
(1)多級(jí)表(Multistage Tables)
轉(zhuǎn) 換表需要空間,。即使是很小的字符集也經(jīng)常會(huì)映射到Unicode標(biāo)準(zhǔn)中幾個(gè)不同的區(qū)塊中,,因此,至少在一個(gè)轉(zhuǎn)換方向上(從Unicode標(biāo)準(zhǔn)到其他編碼標(biāo) 準(zhǔn)或相反),,可能會(huì)包含多至64K個(gè)項(xiàng)(針對(duì)BMP)或1,088K個(gè)項(xiàng)(針對(duì)全部編碼空間),。有多個(gè)方法用于減少映射表的內(nèi)存空間需求,這些方法不僅可 用于轉(zhuǎn)換表,,也可用于其他實(shí)現(xiàn)Unicode標(biāo)準(zhǔn)的表結(jié)構(gòu),,包括字符屬性數(shù)據(jù)、case映射等等,。
(2)Flat Tables
如果磁盤空間不是問題,,虛擬內(nèi)存體系可以為flat table安排可接受大小的工作集,因?yàn)楦髯址氖褂妙l率有很大不同,,即使是小字符集也包含一些不常使用的字符,。并且,需要轉(zhuǎn)換為給定字符集的數(shù)據(jù)中的字符一般不會(huì)來自Unicode標(biāo)準(zhǔn)中的所有區(qū)塊,。
(3)Ranges
提 供一個(gè)精心創(chuàng)建的嵌套范圍判斷對(duì)表進(jìn)行優(yōu)化,,可能比較吸引人。但由于分支損失,,這種方法會(huì)對(duì)現(xiàn)代的高度流水線式的處理器體系造成不必要的性能耗費(fèi),。一種快 速的解決方案是采用優(yōu)化的兩級(jí)表,可以在編碼中不包含任何測(cè)試或分支指令,。盡管哈希表的速度不如多級(jí)表,,但也可用于空間優(yōu)化,。
(4)兩級(jí)表(Two-Stage Tables)
兩 級(jí)表示常用的一種減少表的大小的機(jī)制,。兩級(jí)表使用一個(gè)指針和卻省值的數(shù)組。如果指針為空NULL,,查找返回卻省值,。否則,指針指向用于第二級(jí)查找的數(shù)值 塊,。對(duì)于BMP字符,,按照高字節(jié)和低字節(jié)值來組織這樣的兩級(jí)表非常有效,,第一級(jí)是由256個(gè)指針組成數(shù)組,每個(gè)第二集區(qū)塊中包含256個(gè)值,。對(duì)于增補(bǔ)字 符,,應(yīng)采取不同的方法構(gòu)造指針和二級(jí)數(shù)組,以便充分考慮增補(bǔ)字符在剩余編碼空間中稀疏的散布,。
(5)優(yōu)化的兩級(jí)表(Optimized Two-Stage Table)
當(dāng) 任何區(qū)塊相同時(shí),,對(duì)應(yīng)的指針只需其中一個(gè)區(qū)塊。對(duì)編碼轉(zhuǎn)換表而言,,這種情況一般出現(xiàn)在當(dāng)區(qū)塊中的字符僅僅映射到"卻省"或"無法匹配"的字符時(shí),。不是使用 空指針NULL和一個(gè)卻省值,而是創(chuàng)建了一個(gè)卻省項(xiàng)的"共享"塊,。由于避免使用測(cè)試和分支,,這種策略可以提供接近于簡(jiǎn)單數(shù)租訪問的速度,卻大大節(jié)省了存儲(chǔ) 空間,。
(6)多級(jí)表調(diào)節(jié)(Multistage Table Tuning)
給定一個(gè)具有任意大小和內(nèi)容的表,,可以較容易的創(chuàng)建一個(gè)小的應(yīng)用程序,來計(jì)算多級(jí)表的最佳級(jí)數(shù)和它們的寬度,。通過調(diào)節(jié)級(jí)數(shù)和它們的索引指針數(shù)組的寬度,,可以在表大小和平均訪問時(shí)間之間進(jìn)行折衷。
4.2 ANSI/ISO C wchar_t
在ANSI/ISO C中,,為固定寬度的寬字符定義了類型wchar_t,,ANSI/ISO C將寬字符集語義的定義留給了特定的實(shí)現(xiàn)。
wchar_t的寬度是由編譯器指明的,,可以只有8位大小,。因此,需要在不同C或C++編譯器間可移植的程序不應(yīng)該使用wchar_t存儲(chǔ)Unicode文本,。
對(duì) 于UTF-16的實(shí)現(xiàn),,可以使用宏macro或者類型定義typedef(如UNICHAR),編譯為unsigned short或者wchar_t(依賴于目標(biāo)編譯器和平臺(tái)),。對(duì)UTF-32的實(shí)現(xiàn)可以使用編譯為unsigned int或wchar_t的宏或者是類型定義,。這樣的選擇使在不同的系統(tǒng)平臺(tái)和編譯其中可以正確編譯。
4.3 未知和缺少的字符(Unknown and Missing Characters)
4.3.1 保留的和私用的字符編碼(Reserved and Private-Use Character Codes)
有兩類碼點(diǎn),,即使是完全的Unicode標(biāo)準(zhǔn)實(shí)現(xiàn)也無法正確解釋:
  被保留的碼點(diǎn),;
  在私用區(qū)中的碼點(diǎn)。
一個(gè)實(shí)現(xiàn)不應(yīng)試圖去解釋這樣的碼點(diǎn),。然而,,在實(shí)際中,應(yīng)用程序必須處理為分配的碼點(diǎn)或私用字符。例如,,當(dāng)應(yīng)用程序所處理的文本是由一個(gè)實(shí)現(xiàn)更新版本的Unicode標(biāo)準(zhǔn)的系統(tǒng)創(chuàng)建的,,其中包含更多的分配字符。
對(duì)未知字符顯示的選擇包括將碼點(diǎn)顯示為四到六位十六進(jìn)制數(shù)字,,顯示一個(gè)黑得或白的方塊,,針對(duì)保留字符和私用字符分別顯示適合的字形,或者什么都不顯示,。一個(gè)實(shí)現(xiàn)不能刪除這樣的字符,,也不能無目的地轉(zhuǎn)換為其他字符。
4.3.2可解釋但無法顯示的字符(Interpretable but Unrenderable Character)
一個(gè)實(shí)現(xiàn)可能接收一個(gè)分配給Unicode字符的碼點(diǎn),,但無法顯示它,,因?yàn)闆]有字體或者無法正確顯示。
在這種情況下,,實(shí)現(xiàn)可能會(huì)對(duì)用戶的詢問提供進(jìn)一步有限的反饋,,如對(duì)數(shù)據(jù)進(jìn)行適當(dāng)?shù)呐判颍@示它的書寫系統(tǒng),,或者以卻省放時(shí)顯示碼點(diǎn),。對(duì)無法顯示的(但是已分配的)碼點(diǎn)和未分配的碼點(diǎn),實(shí)現(xiàn)可以通過為無法顯示的碼點(diǎn)使用指示類別的不同字形表示,。
4.3.3卻省的屬性值(Default Property Value)
要使實(shí)現(xiàn)可以正常工作,,需要把未分配的碼點(diǎn)看作字符分配卻省的屬性值,因?yàn)楦鞣N算法都需要分配給每個(gè)碼點(diǎn)的屬性值來運(yùn)作,。這些卻省值不是對(duì)所有未分配的碼點(diǎn)都相同,,因?yàn)榇a點(diǎn)中的某些范圍需要不同的屬性值以便與將來期望的分配做到最大兼容。
除非被特指,,卻省屬性值不是標(biāo)準(zhǔn)的,,具有一致性的實(shí)現(xiàn)可以使用其他值。例如,,取代卻省值,,實(shí)現(xiàn)可能使用以下規(guī)則,為一塊未分配字符插入相鄰已分配字符的屬性值,。
  注意在兩個(gè)方向上最接近的已分配字符,,如果它們處在相同的塊中具有相同的屬性值,則使用這些值,。
  從任一區(qū)塊的邊界開始,,一直擴(kuò)展到塊內(nèi)最近的已分配字符處為止,使用區(qū)塊中字符對(duì)應(yīng)的屬性值,。
  如果所有的碼點(diǎn)完全位于空的或未分配的塊中,,使用對(duì)應(yīng)屬性的卻省值。
4.3.4卻省的可忽略的碼點(diǎn)(Default Ignorable Code Points)
一 般,,在可支持字符集外的碼點(diǎn)使用一個(gè)應(yīng)變的字形顯示,,如一個(gè)黑方塊。然而,,格式和控制字符不應(yīng)該由可見的字形(盡管它們對(duì)其他字符的顯示有影響),。除非對(duì) 于一些特定的處理,這些字符也被忽略,,例如,,字符ZERO WIDTH NON-JOINER在對(duì)照(collation)中忽略。為在不同版本的標(biāo)準(zhǔn)間保證最大程度的兼容性,,范圍U+2060到U+206F,,U+FFF0到 U+FFFB,和U+E0000到U+E0FFF保留給格式和控制字符,。在這些范圍中的位分配碼點(diǎn)應(yīng)該在處理和顯示中被忽略,。
4.4 處理UTF-16中的代理對(duì)(Handling Surrogate Pairs in UTF-16)
在形式良好的UTF-16中,在一個(gè)低代理碼點(diǎn)之前只能是一個(gè)高代理碼點(diǎn),,而不能是另一個(gè)低代理碼點(diǎn),、一個(gè)非代理碼點(diǎn)或者是文本的開頭。一個(gè)高代理碼點(diǎn)的后面也只能跟一個(gè)低代理碼點(diǎn),,而不能是另一個(gè)高代理碼點(diǎn),、一個(gè)非代理碼點(diǎn)或者是文本的結(jié)尾。
高代理碼點(diǎn)和低代理碼點(diǎn)被分配了不相交的編碼單元,,非代理的碼點(diǎn)也不會(huì)使用這些范圍內(nèi)的編碼單元值表示,。因此,在形式良好的UTF-16中的每個(gè)編碼單元必須只滿足下面三個(gè)可能的條件之一:
  一個(gè)單一的非代理編碼單元表示的碼點(diǎn)范圍是0到D7FF或E000到FFFF,;
  一個(gè)高代理碼點(diǎn)表示代理對(duì)的第一部分,;
  一個(gè)低代理碼點(diǎn)表示代理對(duì)的第二部分。
最多訪問兩個(gè)編碼單元,,使用UTF-16編碼格式的處理過程就可以解釋任何Unicode字符,。確定字符邊界最多只需要掃描前一個(gè)或后一個(gè)編碼單元,而不需考慮其他部分,。
只要實(shí)現(xiàn)不去除代理對(duì)中的任一編碼單元,,或者在代理對(duì)中兩個(gè)編碼單元間錯(cuò)誤的插入另一個(gè)字符,就可以保證數(shù)據(jù)的完整性,。而且,,即便數(shù)據(jù)被破壞了,錯(cuò)誤也是局部的,。
UTF-16具有非常有利的頻率分布,,在所有文本數(shù)據(jù)中的大多數(shù)部分中,,代理對(duì)非常罕見,非代理碼點(diǎn)將非常普遍,。這不僅有利于減少由于處理變長(zhǎng)編碼而帶來的性能損失,,也允許一些處理過程可以不對(duì)代理對(duì)采取特別的操作,或者使用已有處理字符序列的機(jī)制來處理代理對(duì),。
實(shí)現(xiàn)必須在處理UTF-16文本時(shí)完全支持代理對(duì),。但是,實(shí)現(xiàn)中的單獨(dú)的組件可以具有對(duì)代理對(duì)不同程度的支持,,只要這些組件之間可以正確的組合和交流,。對(duì)代理對(duì)不同程度的支持由兩個(gè)主要方面決定:
  實(shí)現(xiàn)是否解釋增補(bǔ)的字符?
  實(shí)現(xiàn)是否保證代理對(duì)的完整性,?
Surrogate Support Levels
Support Level Interpretation Interity of Pairs
None No supplementary characters Does not guarantee
Transparent No supplementary characters Guarantees
Weak Some supplementary characters Does not guarantee
Strong Some supplementary characters Guarantees
不支持代理對(duì),,實(shí)現(xiàn)就不會(huì)對(duì)任何增補(bǔ)字符進(jìn)行解釋,也不保證代理對(duì)的完整性,。
透 明的代理對(duì)支持(transparent surrogate support),,用于這樣的組件,如編碼格式轉(zhuǎn)換,,它可能完全保證對(duì)代理對(duì)的正確處理,,但不解釋任何增補(bǔ)字符。也適用于低層串處理操作的組件,,一個(gè) Unicode串只是簡(jiǎn)單地作為編碼單元的數(shù)組而不顧它們的代理狀態(tài),,不對(duì)串進(jìn)行解釋。
不充分的代理支持(weak surrogate support)只正確地處理那些對(duì)應(yīng)可解釋字符的代理對(duì),,可能調(diào)用的組件被保證不會(huì)傳遞無法解釋的字符,。
支持代理對(duì)的策略(Strategies for Surrogate Pair Support)
    處理Unicode標(biāo)準(zhǔn)中高級(jí)特性的一些實(shí)現(xiàn)可以很容易地被改進(jìn),來支持UTF-16的代理對(duì),。例如:
  在文本對(duì)照(text collation)中可以把代理對(duì)作為"組合字符"來處理,。
  文本的輸入可以使用一次按鍵產(chǎn)生兩個(gè)Unicode碼點(diǎn)的鍵盤來完成,就如一次ENTRE鍵可以生成CRLF或者在阿拉伯鍵盤上的"lam-alef"可以生成兩個(gè)字符lam和alef的序列,。
  文本截?cái)?truncation)可以使用與保證組合標(biāo)記緊跟基字符相同的機(jī)制,。
如 果文本編輯器可以保證插入點(diǎn)(insertion point)位于字符邊界,就可以阻止用戶破壞文本,。只要使用文本元素邊界,,低層的串處理程序(如wcschr)就不用進(jìn)行修改。實(shí)際上,,只有某些高層的 處理需要注意代理對(duì),;底層的例程可以繼續(xù)使用對(duì)16位編碼單元操作,而不需特別對(duì)待代理對(duì),。
4.5 處理數(shù)字(Handling Number)
在Unicode 中,,有一些字符集合用于表示不同書寫系統(tǒng)中的十進(jìn)制數(shù)字,。在數(shù)字上,解釋這些字符的系統(tǒng)必須提供正確的數(shù)字值,。比如,,在數(shù)字上,對(duì)序列解釋,,具有值20,。
當(dāng)從二進(jìn)制的數(shù)字值轉(zhuǎn)換為可視的形式時(shí),,可以從不同的書寫系統(tǒng)中選擇數(shù)字,。
ASCII數(shù)字的全角變形(fullwidth)僅是通常數(shù)字的兼容變形,應(yīng)作為一般的西文數(shù)字對(duì)待,。
羅馬數(shù)字和東亞的表意字符數(shù)字也是十進(jìn)制的數(shù)字書寫體系,,但它們?cè)谛问缴喜皇且?0為基數(shù)的數(shù)字系統(tǒng)。因此,,不可能采用一對(duì)一的方式轉(zhuǎn)換成像123456.789的形式,。
使用表意字符,也可能以兩種方法書寫數(shù)字,。如數(shù)字1,234可以表示為"一千二百三十四"或"一二三四",。在數(shù)字解析使支持這些數(shù)字意味著實(shí)現(xiàn)必須能區(qū)分這兩種情況。
有時(shí)候數(shù)字需要解析,,但它們并不是數(shù)的一部分,。例如由字母和數(shù)字組成的標(biāo)示符。
只有在另一層上(如實(shí)現(xiàn)一個(gè)完整的數(shù)學(xué)公式解析器),,對(duì)上標(biāo)(superscripting)的解釋才是至關(guān)重要的,。
4.6 正規(guī)化(Normalization)
(1)可選擇的拼寫(Alternative Spelling)
在Unicode標(biāo)準(zhǔn)中對(duì)最常用的一些加重音符的字符分配明確的編碼。這些字符也可以通過組合獲得,,對(duì)于加重音符的字母,,可以由基字符和非間距標(biāo)記(nonspacing mark)組合而來。
Unicode標(biāo)準(zhǔn)提供對(duì)可由基字符加一個(gè)或多個(gè)非間距標(biāo)記組合而來字符的分解,。分解映射與特定Unicode標(biāo)準(zhǔn)的版本有關(guān),。
(2)正規(guī)化(Normalization)
系統(tǒng)可能會(huì)將Unicode編碼格式的文本正規(guī)化為特定的序列,如將組合字符序列正規(guī)化為由預(yù)組合字符的序列,,或者相反,。
無法處理非間距標(biāo)記的系統(tǒng),可以正規(guī)化為預(yù)組合字符,,適用于大多數(shù)基于拉丁語的現(xiàn)代語言,。對(duì)于無法處理的組合字符,系統(tǒng)可以使用替代顯示方法,,至少在顯示上表示組合,。
對(duì)可以處理非間距標(biāo)記的系統(tǒng),,執(zhí)行正規(guī)化消除預(yù)組合字符可能會(huì)有用,使系統(tǒng)對(duì)組合字符有統(tǒng)一的表示,,保持對(duì)這類字符處理的一致性,。
4.7 壓縮(Compression)
    使用Unicode字符編碼可能會(huì)增加用于保存文件文本部分的存儲(chǔ)和內(nèi)存空間。因此,,對(duì)Unicode文件或串進(jìn)行壓縮是一個(gè)很好的選擇,。壓縮往往建立一個(gè)更高層的協(xié)議,并且依賴于所使用的壓縮方法的知識(shí)進(jìn)行交換,。
4.8 換行的原則(Newline Guidelines)
換 行符在不同的平臺(tái)上表示為:carriage return(CR),、line feed(LF)、CRLF,,或next line(NEL),。不僅換行符使用不同的字符表示,并且在相同平臺(tái)上,,它們也具有不明確的行為,。當(dāng)轉(zhuǎn)換字符集編碼時(shí),這些字符通常被直接轉(zhuǎn)換為對(duì)應(yīng)的 Unicode碼點(diǎn),。這意味著,,即使是處理純Unicode文本的程序也必須解決這些問題。特別是隨著Web的出現(xiàn),,在一臺(tái)機(jī)子上的文本可能具有不同的來 源,,將引起很大問題。
換行符用來明確指示行的邊界,。
4.8.1 定義(Definitions)
Hex Values for Acronyms
Acronym Name Unicode ASCII
CR carriage return 000D 0D
LF line feed 000A 0A
CRLF carriage return and line feed 000D,000A 0D,0A
NEL next line 0085 85
VT vertical tab 000B 0B
FF form feed 000C 0C
LS line separator 2028 n/a
PS paragraph separator 2029 n/a
在Unicode標(biāo)準(zhǔn)中,,沒有正式地分配控制字符,而是為各種7位和8位字符編碼標(biāo)準(zhǔn)中使用控制字符提供相應(yīng)的碼點(diǎn),。確保了Unicode標(biāo)準(zhǔn)與其他編碼標(biāo)準(zhǔn)的相關(guān)性和相互映射,。
縮寫NLF(newline function)表示針對(duì)一個(gè)新行分隔符的一般控制功能。
4.8.2 背景(Background)
段落分隔符(paragraph separator)用于指示段落之間的分隔,。行分隔符(line separator)指示在何處進(jìn)行斷行,,特別是在一個(gè)段落中。
記錄分隔符(record separator)用于分隔記錄,。例如,,當(dāng)交換表格式數(shù)據(jù)時(shí),一種普通的格式是使用TAB分隔單元和在一行單元后使用CRLF,。盡管這種功能與行分隔不是正好相同,,但使用了同樣的字符。
NLF開始時(shí)作為行分隔符?,F(xiàn)在,,在一些簡(jiǎn)單的文本編輯器中還作為行的分隔符,。隨著平臺(tái)和程序開始使用自動(dòng)分行進(jìn)行字處理,這些字符被用于表示段落分隔符,。
一旦NLF被用來表示段落分隔符,,在一些情況下,另一個(gè)控制字符就被作為行分隔符使用,。例如,,在Microsoft Word中,就使用vertical tabulation(VT),。
4.8.3 建議(Recommendation)
在Unicode 中,,定義了兩個(gè)明確的分隔字符:U+2029 PARAGRAPH SEPARATOR(PS)和U+2028 LINE SEPARATOR(LS)。在Unicode文本中,,應(yīng)該在所表達(dá)功能明確的地方使用PS和LS字符,。否則,,當(dāng)從其他字符集轉(zhuǎn)換為Unicode時(shí),,當(dāng) 解釋文本中的字符時(shí),和當(dāng)從Unicode轉(zhuǎn)換為其他字符集時(shí),,使用以下規(guī)則處理NLF,。
即使實(shí)現(xiàn)知道在一個(gè)特定的平臺(tái)上用哪個(gè)字符表示NLF,在輸入和解釋時(shí)CR,、LF,、CRLF和NEL應(yīng)該被相同對(duì)待。只要在輸出時(shí),,才有必要進(jìn)行區(qū)分,。
(1)從其他字符編碼集轉(zhuǎn)換
R1 如果知道NLF的確切的用法,則轉(zhuǎn)換為L(zhǎng)S或PS,。
R1a 如果不知道NLF的確切用法,,則映射為與平臺(tái)對(duì)應(yīng)的NFL。
(2)解釋文本中的字符
R2 總把PS解釋為段落間隔,,把LS解釋為行間隔,。
R2a 在字處理中,把任一NLF都解釋為PS,。
R2b 在簡(jiǎn)單文本編輯中,,把任一NLF都解釋為L(zhǎng)S。
R2c 在解析中選擇最安全的解釋,。
例如,,對(duì)R2c,涉及斷句啟發(fā)規(guī)則的實(shí)現(xiàn)會(huì)按照以下方法,,將NLF安全的解釋為L(zhǎng)S:
  當(dāng)一個(gè)NLF應(yīng)是PS時(shí),,假設(shè)把它解釋為L(zhǎng)S,。因?yàn)槎鄶?shù)段落總是以標(biāo)點(diǎn)符號(hào)結(jié)束,這只會(huì)在個(gè)別情況造成對(duì)句子邊界的錯(cuò)誤識(shí)別,。
  當(dāng)一個(gè)NLF應(yīng)是LS時(shí),,假設(shè)把它解釋為PS。在這種情況下,,行分隔符將是句子斷開,,對(duì)斷句啟發(fā)規(guī)則帶來很大錯(cuò)誤。
(3)轉(zhuǎn)換為其他字符編碼集
R3 如果已知轉(zhuǎn)換的目標(biāo),,根據(jù)目標(biāo)協(xié)定,,適當(dāng)?shù)貙?duì)NLF、LS和PS進(jìn)行映射,。
例如,,當(dāng)映射為Microsoft Word對(duì)文檔的內(nèi)部協(xié)定時(shí),LS將映射為VT,,PS和其他NLF將映射為CRLF,。
R3a 如果不知道轉(zhuǎn)換的目標(biāo),將NLF,、LS和PS映射到平臺(tái)的換行協(xié)定,。
(4)輸入和輸出
R4 函數(shù)readline應(yīng)該在遇到NLF、LS,、FF或PS時(shí)停止,。在典型的實(shí)現(xiàn)中,不包括停止位置的NLF,、LS,、FF或PS。
因?yàn)榉指舴麜?huì)丟失,,對(duì)這種readline函數(shù)的使用僅限于與分隔符的類型無關(guān)的文本處理,。
R4a 函數(shù)writeline應(yīng)該根據(jù)(3)中的協(xié)議轉(zhuǎn)換NLF、LS和PS,。
(5)頁面分隔符
FF一般用作頁面分隔符,,在文本中應(yīng)該按照情況解釋。當(dāng)在屏幕上顯示時(shí),,在分隔符后的文本會(huì)被強(qiáng)制放如下一頁,。它與段落分隔符無關(guān):一個(gè)段落可以在一頁開始在下一頁中繼續(xù)。除非是在頁面中顯示,,在大多數(shù)解析過程和readline中,,與LS的解釋相同。
4.9 正則表達(dá)式(Regular Expressions)
面向字節(jié)的正則表達(dá)式工具需要擴(kuò)展以正確處理Unicode。下面是擴(kuò)展所涉及方面:
  Unicode是一個(gè)很大的字符集,,只適用于處理小字符集的正則表達(dá)式工具可能無法調(diào)整,。
  Unicode包括多種語言,它們具有與英語或其他西歐語言非常不同特性,。
4.10 純文本中的語言信息(Language Information in Plain Text)
4.10.1 語言標(biāo)記的需要
在純文本數(shù)據(jù)中嵌入語言信息的需要經(jīng)常被夸大,。一些普通操作,如對(duì)照(collation)很少需要這些額外信息,。
然 而,,語言信息對(duì)某些操作非常有用,如對(duì)一個(gè)混合語言的文檔執(zhí)行拼寫檢查或者連字(hyphenating),。對(duì)于為無格式文本選擇卻省字體也非常有用,,例 如日文字體中的省略符號(hào)具有與英文字體不同的外觀。當(dāng)前的字體和布局(layout)技術(shù)基于語言信息產(chǎn)生不同結(jié)果,。盡管語言信息對(duì)于執(zhí)行文本-語音轉(zhuǎn)換 (text-to-speech)操作有用,,但當(dāng)前的文本-語音轉(zhuǎn)換軟件都必須對(duì)文本執(zhí)行非常復(fù)雜的語法分析,因此確定語言的額外工作就不那么重要了,。
語言信息可以使用帶外信息(out-of-band)或內(nèi)嵌標(biāo)記(inline tag)表示,。在內(nèi)部實(shí)現(xiàn)中,通常使用帶外信息,,保存在與文本并聯(lián)的數(shù)據(jù)結(jié)構(gòu)中,,而不是嵌入到文本數(shù)據(jù)中,。帶外信息不影響對(duì)文本的正常處理,,還可以輕松的支持對(duì)文本的操作。
4.10.2 語言標(biāo)記與漢字統(tǒng)一
對(duì)Unicode中漢字統(tǒng)一的一個(gè)常見誤解是覺得沒有語言信息就無法正確顯示漢字字符,。其實(shí),,漢字統(tǒng)一的目標(biāo)和方法是確保文本可讀。盡管需要添加字體,、大小,、寬度和其他格式規(guī)格,以便在源和目標(biāo)機(jī)器上準(zhǔn)確產(chǎn)生相同的外觀,,但在沒有這些規(guī)格時(shí),,純文本也能保證可讀。
因?yàn)椴煌瑖?guó)家所使用的統(tǒng)一的漢字間的不同,,都僅限于格式上的變化,,不會(huì)引起Unicode中的混亂。在Unicode中的漢字統(tǒng)一不會(huì)使讀者音唯一不同的字體顯示而無法識(shí)別一個(gè)字符,。如果準(zhǔn)確的字體信息很重要,,最好使用格式文本。
4.11 編輯和選擇(Editing and Selection)
一致的文本元素(Consistent Text Elements)
從 用戶的角度,,文本的基本表示不是所關(guān)心的,,但重要的是,,編輯接口必須對(duì)用戶所認(rèn)為的字符提供一個(gè)統(tǒng)一的實(shí)現(xiàn)。用戶希望在鼠標(biāo)選擇,、方向鍵移動(dòng),、退格等操作 中,這些字符表現(xiàn)得像一個(gè)個(gè)單元,。例如,,當(dāng)實(shí)現(xiàn)這些行為后,對(duì)一個(gè)表示為基字符加非間距組合標(biāo)記序列的加重音符字母,,使用右移方向鍵時(shí),,邏輯上會(huì)從基字符 的開始跳到最后一個(gè)非間距字符后面。
在詞中的編輯和選擇,,一般有三種類型的邊界(boundary),。
簇邊界(cluster boundary)
任意定義的簇邊界可能會(huì)出現(xiàn)在像梵文(Devanagari)這樣的書寫系統(tǒng)中,選擇操作可能會(huì)應(yīng)用于音節(jié)或者音節(jié)的一部分,。在這種情況下,,組合字符序列,如ka+vowel sign或者聯(lián)合的簇ka+halant+ta,,作為單一的單元選擇,。
堆疊字符邊界(stacked boundary)
堆疊字符邊界一般比簇邊界更細(xì)。獨(dú)立的元素(如梵文vowel sign a)可以不受約束的選擇,,但是任何堆疊在一起的字符(包括垂直連字符,,如阿拉伯文中的lam+meem)只能作為單一的單元選擇。
原子字符邊界(atomic character boundary)
原 子字符邊界的使用最接近于單個(gè)Unicode字符的選擇,。然而,,大多數(shù)當(dāng)前系統(tǒng)都采用某種矩形加亮的方式表示選擇操作。這種方法限制了編輯操作的一致性,, 因?yàn)橐恍┳址蛄胁皇菑男械钠鹗继幊芍本€地發(fā)展,。當(dāng)字符堆疊時(shí),兩種機(jī)制被用于對(duì)部分選擇地顯示:直線的和非直線的邊界,。
直線的邊界(linear boundary)
使用直線邊界,,將合成字形的全部寬度都?xì)w屬于序列的第一個(gè)字符,認(rèn)為其余字符沒有寬度,。
這是最簡(jiǎn)單的一種機(jī)制,。它的優(yōu)點(diǎn)是只需要很少的額外實(shí)現(xiàn)工作。它的缺點(diǎn)是選擇窄字符變得非常困難,,更不用說零寬度的字符,。需要用戶剛好從非間距標(biāo)記右邊開始選擇,并且正好拖到左邊。如果有多個(gè)非間距標(biāo)記,,它也不允許對(duì)單個(gè)標(biāo)記進(jìn)行選擇,。
非直線的邊界(nonlinear boundary)
使用非直線邊界把任何堆疊字符分成各個(gè)部分??梢酝ㄟ^對(duì)多個(gè)矩形加亮,,或者對(duì)單個(gè)字符著色的方法進(jìn)行表示。
注意到,,通過更多的操作,,一個(gè)預(yù)組合的字符在刪除操作中可以表現(xiàn)得像一個(gè)具有原子字符邊界組合字符序列一樣。這個(gè)過程包括動(dòng)態(tài)地獲得字符的分解表示,,得到用作模擬的組件,。
在多數(shù)系統(tǒng)中,字符時(shí)文本中最小的可尋址單元,,所以選擇操作和屬性分配操作(如字體,、顏色、字符間距等)都在字符的基礎(chǔ)上執(zhí)行,。對(duì)于預(yù)組合地字符無法模擬這種可尋址性,,系統(tǒng)地修改所有文本編輯工具來對(duì)字符的一部分進(jìn)行尋址,會(huì)十分低效,。
由 于文本元素不具有一個(gè)單一的概念,,因此,對(duì)字符邊界的編輯也沒有一個(gè)統(tǒng)一的概念,。在不同情況下,,用戶可能會(huì)在編輯過程中使用不同程度的粒度大小??梢钥紤] 兩種方法:首先,,用戶可能設(shè)定對(duì)字符邊界的一個(gè)全局偏好;第二,,用戶可能有可選的命令機(jī)制,如Shift-Delete,,可以提供對(duì)卻省模式更細(xì)(或更 粗)的控制,。
4.12 處理非間距標(biāo)記的策略
依據(jù)一下策略,開發(fā)者可以實(shí)現(xiàn)對(duì)非字符間距有效和高效使用的系統(tǒng)和例程,。開發(fā)者也可以選擇適用于絕大多數(shù)已有系統(tǒng)的最小限度的技術(shù),,和適用于要求更苛刻的情況的復(fù)雜技術(shù),如高端的桌面出版,。
在 這里,,術(shù)語非間距標(biāo)記(nonspacing mark)和組合字符(combining character)可以互換使用。有時(shí)會(huì)使用術(shù)語diacritic、accent,、stress mark,、Hebrew point、Arabic vowel等,,而不是非間距標(biāo)記(它們表示特定類型的非間距標(biāo)記),。
為支持非間距標(biāo)記,只需要相對(duì)較小數(shù)量的實(shí)現(xiàn)特性,。存在多種可能層次的實(shí)現(xiàn),。一個(gè)最小的系統(tǒng)可以產(chǎn)生較好的結(jié)果,并且相對(duì)容易實(shí)現(xiàn),。要求大多數(shù)特性地系統(tǒng),,只是對(duì)已有軟件地簡(jiǎn)單修改。
因?yàn)橛幸恍┱Z言要求非間距標(biāo)記,,如Arabic,、Hebrew和印度次大陸的語言,已有一些可以處理這些字符的系統(tǒng),,可以利用已有經(jīng)驗(yàn)來生成處理Unicode標(biāo)準(zhǔn)中這些字符的多用途軟件,。
顯示(rendering)
一 部分確定的組合字符序列可以通過簡(jiǎn)單的替換來有效顯示。當(dāng)遇到一個(gè)有基字符加一個(gè)或多個(gè)非間距組合標(biāo)記組成的序列時(shí),,可以使用表示組合形式的字形進(jìn)行替 換,。在簡(jiǎn)單地字符顯示中,一個(gè)非間距組合標(biāo)記不增加寬度,,一個(gè)組合字符序列的具有與基字符相同的寬度,。當(dāng)截?cái)啻畷r(shí),從結(jié)尾處開始向后執(zhí)行截?cái)嗫偸亲钊菀住?后續(xù)的非間距標(biāo)記將不會(huì)與前面的基字符分開,。
一個(gè)更復(fù)雜得顯示系統(tǒng)會(huì)考慮使用非間距標(biāo)記時(shí)對(duì)寬度和字距更細(xì)微的調(diào)整,,或者組合字符序列具有與基字符不同寬度。對(duì)大多數(shù)應(yīng)用而言,,這樣地顯示系統(tǒng)并不是必需的,。
其他處理:正確的多語言比較例程也必須能夠把字符序列作為一個(gè)字符比較,或者把一個(gè)字符看作是一個(gè)字符序列,。只要提供了適當(dāng)?shù)臄?shù)據(jù),,這些例程也能處理組合字符序列。當(dāng)查詢串時(shí),,要檢查目標(biāo)串中可能會(huì)影響最后一個(gè)匹配字符解釋的附加非間距標(biāo)記,。
斷行算法一般使用狀態(tài)機(jī),確定詞間的中斷,。這樣的算法可以很容易地改進(jìn),,來阻止將非間距標(biāo)記從基字符分開,。
鍵盤輸入(Keyboard Input)
用 于組合字符序列輸入的一個(gè)常見實(shí)現(xiàn),是使用所謂的dead key,。這些鍵與打字機(jī)生成這樣序列所使用的機(jī)制匹配,,通過在非間距標(biāo)記之后鍵入基字符。在計(jì)算機(jī)的實(shí)現(xiàn)中,,當(dāng)按下針對(duì)重音符的dead key時(shí)鍵盤進(jìn)入一種特殊的狀態(tài),,只有當(dāng)鍵入一些有限數(shù)目的"合法"基字符之一時(shí)產(chǎn)生一個(gè)預(yù)組合的字符。根據(jù)需要,,可以改進(jìn)系統(tǒng)來生成組合字符序列或者預(yù) 組合的字符,。盡管打字員,特別是使用Latin書寫系統(tǒng)的,,是針對(duì)這類系統(tǒng)培訓(xùn)的,,然而在Unicode標(biāo)準(zhǔn)中一些書寫系統(tǒng)(包括Latin)可能會(huì)依據(jù) 書寫的順序來實(shí)現(xiàn),用戶首先鍵入基字符,,其后跟著重音符或其他非間距標(biāo)記,。
在書寫順序的情況下,每一次鍵入都在屏幕上產(chǎn)生一個(gè)不同的自然變化,。要給已有的字符添加重音符,,用戶需要把插入點(diǎn)移到字符后在鍵入重音符。
截?cái)?Truncation)
有兩種類型的階段:根據(jù)字符數(shù)目截?cái)嗪透鶕?jù)顯示寬度截?cái)?。根?jù)字符數(shù)目截?cái)嗫赡軒頂?shù)據(jù)損失,,也可以是無損失的。
根據(jù)字符數(shù)目進(jìn)行截?cái)嗍褂迷?,由于存?chǔ)限制,,只有有限數(shù)目的字符可以放入某區(qū)域;也用于,,為了傳送和其他目的將文本插入緩沖區(qū)中,。在后一種情況下,如果在處理前緩沖區(qū)中的數(shù)據(jù)可以無縫的重新組合,,或者預(yù)先檢查一下可能出現(xiàn)的跨緩沖區(qū)組合字符序列,,就可以做到不丟失數(shù)據(jù)。
當(dāng)調(diào)整數(shù)據(jù)以適應(yīng)有現(xiàn)長(zhǎng)度的區(qū)域時(shí),,一些信息將會(huì)丟失,。在文本邊界上進(jìn)行截?cái)啵ɡ纾诮M合字符序列的最后或者在最后一個(gè)詞邊界)通常比在最后一個(gè)碼點(diǎn)后截?cái)喔扇 ?
根據(jù)顯示寬度截取用于有限范圍內(nèi)的可視顯示,。在這種情況下,截?cái)嗍且罁?jù)結(jié)果串的寬度而不是字符的數(shù)目,。在簡(jiǎn)單的系統(tǒng)中,,依據(jù)寬度截?cái)嗪苋菀?,從末尾處開始向后操作減去字符的寬度。由于后續(xù)非間距標(biāo)記對(duì)串的尺寸沒有貢獻(xiàn),,最后結(jié)果不會(huì)把非間距標(biāo)記與它們的基字符分開,。
如果文本環(huán)境會(huì)更復(fù)雜,字符的寬度可能會(huì)依賴上下文環(huán)境,,由于字符間距調(diào)整,、連字或上下文信息等的作用。對(duì)這種系統(tǒng),,一個(gè)組合字符的寬度可能會(huì)與一個(gè)單獨(dú)的窄字符(如i)的寬度不同,。處理這種情況,必須對(duì)截?cái)嘟Y(jié)果進(jìn)行核查,。
一個(gè)不同的選擇是在圖形上對(duì)字符進(jìn)行修剪,。但不幸的是,結(jié)果可能很難看,。并且,,如果修剪出現(xiàn)在字符之間,可能不會(huì)給出任何世界反饋表示字符被刪除了,。
4.13 非間距標(biāo)記的顯示(Rendering Nonspacing Marks)
在這里假定使用均衡字體(proportional font),,單個(gè)字符的寬度可以變化。對(duì)于等寬字體(monospaced font),,可以使用各種技術(shù),,但一般而言,對(duì)于這種字體的多數(shù)書寫系統(tǒng),,可能只有一種正確的顯示外觀,。
當(dāng) 顯示的序列中包含多于一個(gè)的非間距標(biāo)記時(shí),卻省情況下,,非間距標(biāo)記從基字符向外堆疊,。即,如果亮格非間距標(biāo)記出現(xiàn)在基字符的之上,,則第一個(gè)非間距標(biāo)記位于 基字符上面,,第二個(gè)非間距標(biāo)記為與第一個(gè)標(biāo)記上面。如果亮格非間距標(biāo)記出現(xiàn)在基字符的之下,,則第一個(gè)非間距標(biāo)記位于基字符下面,,第二個(gè)非間距標(biāo)記為與第一 個(gè)標(biāo)記下面。
這種卻省行為可能會(huì)根據(jù)排字上的偏好,,或者某個(gè)特定書寫系統(tǒng)中對(duì)多個(gè)非間距標(biāo)記的特定正字法處理,,而改變。
后退的顯示(fallback rendering)
有幾個(gè)方法可用于處理在一個(gè)固定的可顯示集合外未知的組合字符序列,。
一種方法是Show Hidden,,通過先顯示基字符再把非間距標(biāo)記作為單個(gè)單元顯示,,來表示無法描繪序列。
另一種方法是Simple Overlap,,將重疊的零寬度非間距標(biāo)記放置在卻省的固定位置處,,一般所放置的位置例可能的基字符較遠(yuǎn)。盡管顯示結(jié)果對(duì)于一些字母而言沒有吸引力,,但在只有一個(gè)非間距標(biāo)記的情況下,,結(jié)果一般還是可以辨認(rèn)的。
在一個(gè)退化的情況下,,一個(gè)非間距標(biāo)記作為文本的首字符出現(xiàn),,或者被行分隔符、段落分隔符或其他引起位置分隔的格式符從它的基字符分開,。這種結(jié)果稱為不良的組合字符序列,。不良的組合字符序列在顯示時(shí),看作是以一個(gè)空格作為基字符,。
雙向定位(bidirectional positioning)
在雙向文本中,,非間距標(biāo)記與它們的基字符一起重新排序。即視覺上,,在使用雙向算法之后它們應(yīng)用于相同的基字符,。
調(diào)整(justification)
典型地,對(duì)文本的完全調(diào)整要給間距字符(space character)添加額外的空間,;然而,,如果只有很少(或沒有)間距字符,一些系統(tǒng)會(huì)在字符間添加額外的字間隔空(letterspacing),。如果在文本中包含零寬度的非間距標(biāo)記,,則需要對(duì)該過程進(jìn)行改進(jìn)。
因?yàn)榉情g距標(biāo)記總是跟隨它們的基字符,,正確的調(diào)整過程應(yīng)該只有當(dāng)?shù)诙€(gè)字符是一個(gè)基字符時(shí)才會(huì)在字符見添加字間隔空,。
規(guī)范等價(jià)性(Canonical Equivalence)
在 顯示多個(gè)重音符時(shí),必須考慮規(guī)范等價(jià)性,,以便使任兩個(gè)規(guī)范等價(jià)的序列顯示結(jié)果相同,。這一點(diǎn)在當(dāng)規(guī)范順序與習(xí)慣的鍵盤輸入順序不相同時(shí)特別重要,如具有元音 符號(hào)的阿拉伯文和使用點(diǎn)的希伯萊文,。在這些情況下,,顯示系統(tǒng)得到的是典型的鍵入順序或者是經(jīng)過正規(guī)化(normalization)的規(guī)范順序。
顯示系統(tǒng)應(yīng)該處理組合標(biāo)記的任何具有規(guī)范等價(jià)性的序列,。這不會(huì)有性能問題,,因?yàn)閷?duì)組合標(biāo)記重新排序所需的時(shí)間與其他顯示工作的耗時(shí)相比微不足道。
一個(gè)顯示系統(tǒng),,在需要時(shí),,可以在內(nèi)部對(duì)標(biāo)記重新排序,,只要結(jié)果序列是規(guī)范等價(jià)的,。
定位方法(Positioning Methods)
有一些方法可用于定位非間距標(biāo)記,,使它們相對(duì)于基字符和前一個(gè)非間距標(biāo)記(如果有的話)的位置正確。
使用連字(positioning with Ligature)
一 個(gè)固定范圍的組合字符序列可以使用相對(duì)簡(jiǎn)單的替換來有效顯示,。當(dāng)字形可以表示一個(gè)序列<基字符,,非間距標(biāo)記>時(shí),使用這個(gè)字形替換組合形式,。 因?yàn)榉情g距標(biāo)記的擴(kuò)展寬度為零,,組合字符序列將自動(dòng)具有與基字符相同的寬度。跟復(fù)雜的文本顯示系統(tǒng)可能會(huì)采取進(jìn)一步的措施來處理一些特殊情況,,如組合字符 序列的緊排(kern)或者寬度與基字符不同,。
使用連字可能是支持非間距標(biāo)記最簡(jiǎn)單的方法。對(duì)于較小的固定字集,,如那些對(duì)應(yīng)ISO/IEC 8859-1(Latin-1)重預(yù)組合字符的,,可以直接采用該方法。因?yàn)榻M合字符序列幾乎總是具有與基字符相同的寬度,,對(duì)這些字符的顯示,、測(cè)量和編輯與 一般連字的情況相比都更容易。
如果組合字符序列不能形成一個(gè)連字,,就需要采用以下兩種方法之一,。如果這些方法都不可用,則使用后退的方法,。
根據(jù)上下文結(jié)構(gòu)定位(positioning with contextual forms)
處理非間距標(biāo)記定位的一個(gè)較通用的方法是使用上下文的結(jié)構(gòu),。在這種情況下,有幾個(gè)不同的字形對(duì)應(yīng)于重音符的不同位置,。依據(jù)大致的形狀和寬度,,基字形(基字符的字形?)通常分成數(shù)目較小的一些類別,。根據(jù)基字形的類別,,為非間距標(biāo)記選擇一個(gè)特定的字形。
在一般情況下,,可以從一些具有不同高度的字形中進(jìn)行選擇,,以便堆疊字形。這種方法可以與使用連字的方法結(jié)合使用,,就可在特定情況下,,使用連字生成更高的變形。
使用增強(qiáng)的字距調(diào)整(positioning with enhanced kerning)
第三種用于定位讀音符號(hào)的技術(shù)是對(duì)常規(guī)的字距調(diào)整(水平的和垂直的)的擴(kuò)充,。典型地,,字距調(diào)整過程唯一對(duì)字形映射一個(gè)位置偏移量,。例如,在詞語"To"中,,"o"應(yīng)該向"T"下面靠一點(diǎn),。這種系統(tǒng)的擴(kuò)充則分別映射一個(gè)垂直的和水平的偏移量。
為了針對(duì)一般情況可以有效應(yīng)用,,字距調(diào)整過程也必須能夠處理比簡(jiǎn)單字符對(duì)更復(fù)雜的情況,,如在一個(gè)基字符后可能有多個(gè)讀音符號(hào)。
使用增強(qiáng)的字句調(diào)整技術(shù)進(jìn)行定位,,也可以和使用連字的方法結(jié)合運(yùn)用,。
4.14 定位文本元素邊界(Locating Text Element Boundaries)
Unicode 編碼的文本串經(jīng)常需要被分解為文本元素。文本元素的一般例子包括字符,、詞,、行和句子。文本元素的準(zhǔn)確確定可能會(huì)依據(jù)地區(qū)而變化,。但要與用戶的理解相匹配并 不是總能達(dá)到的,,因?yàn)槲谋颈旧聿⒉豢偸前銐虻男畔⒂糜诿鞔_決定邊界。例如,,句點(diǎn)"."(U+002E FULL STOP)的使用具有歧義,,有使用于表示句子結(jié)束,有時(shí)用于縮寫,,有時(shí)則用于數(shù)字,。然而,在多數(shù)情況下,,文本邊界可以符合用戶的理解,。
4.15 標(biāo)識(shí)符(Identifiers)
Unicode 標(biāo)準(zhǔn)的實(shí)現(xiàn)面臨的一個(gè)常見任務(wù)是提供針對(duì)標(biāo)識(shí)符的解析工具。為了促進(jìn)在基于Unicode字符的解析器中對(duì)標(biāo)識(shí)符的標(biāo)準(zhǔn)化處理,,這里針對(duì)標(biāo)識(shí)符語法的定義 提出一套指導(dǎo)方針,。這些指導(dǎo)方針并不比普通程序設(shè)計(jì)語言中規(guī)則更復(fù)雜,只不過包含了更多具有不同類型的字符,。
基于屬性的標(biāo)識(shí)符語法(property-based identifier syntax)
這 里提供的正式語法就是要明確,,一個(gè)標(biāo)識(shí)符是由一個(gè)字母或者一個(gè)表意字符開始,包含任意數(shù)目的字母,、表意字符,、數(shù)字或下劃線的字符串組成的。每種程序設(shè)計(jì)語 言標(biāo)準(zhǔn)都有自己的標(biāo)識(shí)符語法,,不同程序設(shè)計(jì)語言對(duì)ASCII范圍內(nèi)特定字符的使用有不同的約定,。對(duì)這些語法進(jìn)行擴(kuò)充以具備Unicode實(shí)現(xiàn)的全部行為, 只需要講這些特定規(guī)則與下面提供的樣本語法結(jié)合。
為了正確的涵蓋Unicode標(biāo)準(zhǔn),,樣本標(biāo)識(shí)符語法中的革新之處包括:
  結(jié)合對(duì)組合標(biāo)記的恰當(dāng)處理,。
  允許有布局和格式控制字符,在解析標(biāo)識(shí)符時(shí)忽略,。
組合標(biāo)記(combining marks)
標(biāo)識(shí)符語法中必須考慮組合標(biāo)記,。由一個(gè)基字符跟隨若干組合標(biāo)記組成組合字符序列對(duì)一個(gè)標(biāo)識(shí)符而言是有效的。
封閉的組合標(biāo)記被排除在的語法定義外,,因?yàn)橛伤鼈兒妥帜杆M合得到的組合字符不是這些標(biāo)識(shí)符有效的組成部分,。
布局和格式控制字符(layout and format control character)
用 于控制組合行為,雙向順序控制和可選顯示格式的Unicode字符,,被明確定義為不影響中斷行為。不像空格符或其他分隔符,,它們不用來指示詞,、行或其他單 元的邊界。因而,,為了標(biāo)識(shí)符定義,,將它們明確包括在內(nèi)。一些實(shí)現(xiàn)可能選擇過濾掉這些可忽略字符,,這種方法的優(yōu)點(diǎn)在于兩個(gè)顯示相同的標(biāo)識(shí)符更可能是相同的,。
特殊字符調(diào)整(specific character adjustments)
特殊的標(biāo)識(shí)符語法可以被看作是基于字符屬性對(duì)普通語法的少量修改。例如,, SQL標(biāo)識(shí)符允許下劃線作為標(biāo)識(shí)符的一部分(但不能作為開始字符),;而C標(biāo)識(shí)符允許既下劃線作為標(biāo)識(shí)符的一部分也可以作為標(biāo)識(shí)符的開始字符。
可以考慮排除在標(biāo)識(shí)符外的字符集合包括所有兼容映射具有標(biāo)記的字符,。
語法規(guī)則(Synactic Rule)
:= (|
)*
Sytactic Classes for Identifiers

Syntactic Class Properties
General Category = L or Nl, or
Other_ID_Start = true
General Category = Mn, Mc, or Nd, Pc, or Cf
可選建議(Alternative Recommendation)
使用語法類別不足之處是,,用于詳細(xì)定義的存儲(chǔ)空間,以及隨著新版本Unicode標(biāo)準(zhǔn)添加的新字符無法被已有的解析器識(shí)別,。也就是說,,無法做到向上兼容。
解決該問題的一個(gè)方法是,,不去定義允許使用的碼點(diǎn)集合,,而是將一個(gè)較小的固定的碼點(diǎn)集合保留給語法使用并且允許使用其他任何碼點(diǎn)(包括非分配的碼點(diǎn))用作標(biāo)識(shí)符的一部分。按照這種規(guī)范編寫的解析器對(duì)任何版本的Unicode標(biāo)準(zhǔn)得表現(xiàn)相同,。
這種方法的缺點(diǎn)是標(biāo)識(shí)符中部分可能是沒有意義的東西,,因?yàn)閷⒃~匯分類與人類的可理解性分開了。然而,,可理解性可以通過其他方法解決,,如使用用法指南限定使用有意義的術(shù)語。例如W3C指定的規(guī)范XML 1.1。
通 過增加不允許使用字符的集合,,可以得到針對(duì)標(biāo)識(shí)符較直觀的建議,。這種方法使用Unicode標(biāo)準(zhǔn)一個(gè)特定版本中關(guān)于標(biāo)識(shí)符類別的所有規(guī)范,并且永遠(yuǎn)不允許 使用該版本中不推薦用作標(biāo)識(shí)符的字符,。該版本Unicode標(biāo)準(zhǔn)中沒有分配的所有碼點(diǎn)可用于標(biāo)識(shí)符,,已經(jīng)考慮到將來對(duì)版本的添加。這種方法保證了向上兼容 的標(biāo)識(shí)符穩(wěn)定性,,以及將字符合理地劃分為具有或不具有意義的標(biāo)識(shí)符組成,。
可以對(duì)禁止使用的碼點(diǎn)列表進(jìn)行一些額外的擴(kuò)充,來進(jìn)一步限制不合理的標(biāo)識(shí)符,。
4.16 排序和查找
排 序和查找操作部分相一致,,都要實(shí)現(xiàn)相互比較項(xiàng)的等價(jià)程度判定。在查找操作中,,等價(jià)定義項(xiàng)是否匹配,;在排序操作中,等價(jià)影響項(xiàng)在有序隊(duì)列中的鄰近,。等價(jià)的確 定經(jīng)常依賴于應(yīng)用和語言,,但對(duì)于支持Unicode標(biāo)準(zhǔn)的實(shí)現(xiàn)而言,排序和查找必須考慮到Unicode字符的等價(jià)性和規(guī)范順序,。
與語言文化有關(guān)的排序和查找
排 序順序隨著文化的不同而變化,,并且一些特殊的應(yīng)用需要變化。排序的順序可以依據(jù)詞或者句子,,區(qū)分大小寫或者不分大小寫,,忽略重音符或者不忽略;也可以是依 據(jù)語音,,或者基于字符的外觀,,比如使用筆劃和部首對(duì)東亞的表意字符排序。對(duì)漢字的語音排序需要使用詞語的查找詞典,,或者是可以維持文本中詞和相關(guān)語音拼寫 的特殊程序,。
語言不僅決定使用哪一種排序,而且決定什么構(gòu)成排序的基本元素,。例如,,瑞典語中將U+00C4 LATINE CAPITAL LETTER A WITH DIAERESIS作為一個(gè)單獨(dú)的字母,在字母表中排在z之后,;然而,,在德語中,則作為ae或者識(shí)跟隨在a之后的其他重音形式,。西班牙語在傳統(tǒng)上將連字 ll看作在l和m之間的字母來排序,。
因此,不可能在編碼時(shí)以某種順序安排字符以便通過簡(jiǎn)單的二進(jìn)制串比交接可以生成期待的順序,也不可能提供單級(jí)的排序權(quán)重表,。后者意味著字符編碼細(xì)節(jié)對(duì)文化上期待的排序只具有間接的影響,。
與語言無關(guān)的排序
在 一些環(huán)境下,應(yīng)用程序可能需要進(jìn)行與語言無關(guān)的排序,,即對(duì)文本數(shù)據(jù)排序,,而不考慮針對(duì)串如何排序的與語言相關(guān)的文化期望。例如,,一個(gè)臨時(shí)的索引可能只需要 以某些定義良好的順序排列,,但排序的準(zhǔn)確細(xì)節(jié)并不重要或者對(duì)用戶不可見。然而,,即使在這種情況下,,也需要注意一些問題。
首先,,三種Unicode編碼格式的二進(jìn)制排序存在一些細(xì)微的差別,。只需要對(duì)Unicode串進(jìn)行二進(jìn)制比較的實(shí)現(xiàn)必須考慮這一點(diǎn),不至于在使用不同編碼格式的應(yīng)用程序間引起互操作問題,。
一些排序或者查找應(yīng)用,即使不關(guān)心排序中與語言相關(guān)的差別,,也要求與大小寫無關(guān),。傳統(tǒng)上,執(zhí)行與大小寫無關(guān)比較的實(shí)現(xiàn)是通過在二進(jìn)制比較前將兩個(gè)串都轉(zhuǎn)換為大寫的形式來完成的,。然而,,這種方法一般不能擴(kuò)展到Unicode標(biāo)準(zhǔn)中的所有字符。
查找
查找也受比較操作中一些同樣的問題影響,。也增加了其他一些特征,,如只匹配詞(即在匹配的兩邊都是詞的邊界)。一種技術(shù)是針對(duì)一個(gè)弱匹配進(jìn)行快速查找,。當(dāng)發(fā)現(xiàn)一個(gè)候選匹配時(shí),,根據(jù)其他標(biāo)準(zhǔn)(如匹配變音符,詞匹配,,大小寫匹配等等),。
當(dāng) 查找串時(shí),必須檢查目標(biāo)串中尾隨的非間距標(biāo)記,,可能影響最后一個(gè)匹配字符的解釋,。也就是,查找"San Jose"可能會(huì)在串"Visiting San José, Costa Rica is a ..."發(fā)現(xiàn)一個(gè)匹配,。如果要求準(zhǔn)確的匹配,,則應(yīng)該否決該匹配。如果只要求弱匹配,則可以接受該匹配,,但是在返回目標(biāo)字串的位置和長(zhǎng)度時(shí)必須包括尾隨的非 間距標(biāo)記,。
弱等價(jià)的一個(gè)重要應(yīng)用是與大小寫無關(guān)的檢索。一些傳統(tǒng)的實(shí)現(xiàn)將查找串和目標(biāo)串都映射為大寫,。然而,,大小寫映射是依賴語言的,并且不是沒有歧義,。
因?yàn)閺耐獠孔址腻e(cuò)誤映射,,產(chǎn)生一個(gè)相關(guān)問題。為了解決這個(gè)問題,,可以將用戶易搞混的字符歸為一個(gè)弱匹配類,。這種方法在查找命名的文件或其他對(duì)象時(shí)可以更好的滿足用戶的語氣。
次線性查找(Sublinear Searching)
使用比較信息,,通過硬算(brute force),,國(guó)際化的查找是可能的。然而,,這種策略在最壞情況下需要O(m*n)算法,,在一般情況下需要O(m)算法,n是所尋找的模式中字符的數(shù)目,,m是目標(biāo)串中的字符數(shù),。
一些算法可以使用次線性的算法對(duì)簡(jiǎn)單文本進(jìn)行快速查找。通過在目標(biāo)串中跳過字符,,這些算法在通常情況下的復(fù)雜度只有O(m/n),。
在次線性查找中采用與語言有關(guān)的比較算法的主要問題,與多映射和可忽略有關(guān),。另外,,次線性算法預(yù)先計(jì)算信息表。
4.17 二進(jìn)制順序
如果比較文本對(duì)最終用戶是可見的,,就應(yīng)該使用正確的語言排序,。然而,在有一些情況下,,只需要一個(gè)快速的有良好定義的排序,。在這種情況下,可以使用一個(gè)二進(jìn)制排序,。
Unicode 中的所有編碼格式并沒有相同的二進(jìn)制順序,。UTF-8和UTF-32的數(shù)據(jù)以碼點(diǎn)順序排序,而UTF-16的數(shù)據(jù)(碼點(diǎn)高于U+FFFF)則不是,。而且,, 當(dāng)UTF-16或UTF-32數(shù)據(jù)使用某個(gè)Unicode模式序列化,,并以字節(jié)比較時(shí),得到的字節(jié)序列可能具有也可能沒有相同的二進(jìn)制排序,,因?yàn)榻粨Q字節(jié) 順序?qū)⒂绊憯?shù)據(jù)的大體排序,。由于這些因素,UTF-16BE,、UTF-16LE,、UTF-32LE編碼方案下的文本不是以碼點(diǎn)順序排序。
一般,,Unicode文本的卻省二進(jìn)制排列順序應(yīng)該是碼點(diǎn)順序,。然而,可能需要與特定編碼格式中的編碼單元順序(或是特定編碼方案的字節(jié)排序)匹配,,以便完成不同應(yīng)用中使用的排序,。
4.18 Case Mapping
Case 是特定字母表中字符的一個(gè)標(biāo)準(zhǔn)屬性,比如Latin,、Greek,、Cyrillic、Armenian,,和古代格魯吉亞文,,字符被認(rèn)為是單個(gè)字母的變體。 這些變體在形狀和大小上可能區(qū)別很大,,稱為大寫字母和小寫字母,。一般大寫字母比小寫字母大。具有大小寫差異的字母表稱為bicameral,;沒有的則稱為 unicameral。
為了兼容性還包含了某些組合字符,,如U+01F1 "DZ" LATIN LETTER DZ,,就有了第三種狀態(tài),稱作titlecase,,用于當(dāng)詞的第一個(gè)字符被大寫時(shí),。這種字符的一個(gè)例子是U+01F2 "Dz" LATIN CAPITAL LETTER D WITH SMALL LETTER Z。
因此,,三種狀態(tài)形式為UPPERCASE,、Titlecase和lowercase。
術(shù)語"titlecase"可用于指詞語,,它的第一個(gè)字母是一個(gè)大寫字母或者是titlecase字母,,其余字母為小寫。然而,,并不是所有在文檔標(biāo)題中的詞或者句子中的第一個(gè)詞都是titlecase,。
決 定哪一個(gè)詞是titlecase依賴于語言,。例如"Taming of the Shrew"在英語中是適當(dāng)?shù)拇髮懀?Taming Of The Shrew"不是,。而且,,決定什么真正組成一個(gè)詞是與語言相關(guān)的。例如,,l'arbre在法語種可能被認(rèn)為是兩個(gè)詞,,但can't在英語種被認(rèn)為是一個(gè) 詞。
Case Mapping的困難
一旦字符集超出了ASCII的范圍,,case mapping就會(huì)有一些困難,。
在多數(shù)情況下,titlecase與uppercase相同,,但并不總是這樣,。例如,U+01F1 "DZ" capital dz的titlecase是U+01F2 "Dz" capital d with small z,。
case mapping可能生成與源串的長(zhǎng)度不同的串,。例如,德文字符U+00DF LATIN SMALL LETTER SHARP S在轉(zhuǎn)換成大寫時(shí)擴(kuò)張成兩個(gè)字符的序列"SS",。這種情況也出現(xiàn)在沒有預(yù)組合字符的情況下,。
由一些字符需要特殊的處理,如U+0345 combining iota subscript,。
依 賴上下文環(huán)境,,字符也可能有不同的case mapping。例如,,U+03A3 GREEK CAPITAL LETTER SIGMA,,當(dāng)后面跟隨其他字母的時(shí),對(duì)應(yīng)的小寫字符為U+03C3 GREEK SMALL LETTER SIGMA,;沒有跟其他字母時(shí),,對(duì)應(yīng)小寫字符為U+03C2 GREEK SMALL LETTER FINAL SIGMAL。
字符的case mapping可能依賴于地區(qū),。
由于一些字母實(shí)際上不分大小寫,,沒有匹配的大寫形式,因此,,將一個(gè)串轉(zhuǎn)換為大寫的過程并不意味著不包括任何小寫字母,。
可逆性(Reversibility)
必須注意到,沒有case轉(zhuǎn)換操作時(shí)可逆的,。例如:
toUpperCase(toLowerCase("John Brown")) -> "JOHN BROWN"
toLowerCase(toUpperCase("John Brown")) -> "john brown"
甚 至還有一些單個(gè)詞,,像意大利語中的vederLa或英語中的名字McGowan,既不是大寫,,也不是小寫或titlecase,。這種形式有時(shí)稱作 inner-caps,,通常用于程序設(shè)計(jì)和Web名稱。一旦串"McGowan"被轉(zhuǎn)換成大寫,、小寫或titlecase,,就不可能通過另一個(gè)大寫、小寫 或titlecase操作恢復(fù)原樣,。也存在單個(gè)的字符沒有可逆的映射,,如希臘文中的sigma。
對(duì)于使用單個(gè)命令鍵組成的序列在不同case間轉(zhuǎn)換所選擇內(nèi)容的字處理軟件,,建議保存初始串,,并且可以通過鍵序列返回初始串。用戶界面要生成以下對(duì)一系列命令鍵響應(yīng)的結(jié)果,。注意,,初始串每隔四次就會(huì)被存儲(chǔ)。
1. The quick brown
2. THE QUICK BROWN
3. the quick brown
4. The Quick Brown
5. The quick brown
在字處理軟件中,,大寫,、小寫和titlecase可以使用字符類型來表示。去除字符類型,,就將文本恢復(fù)為初始狀態(tài),。然而,如果采用這種方法,,任何拼寫檢查軟件必須注意case類型,,以便可以對(duì)真正的外觀進(jìn)行檢查。
不分大小寫的匹配(Caseless Matching)
不分大小寫的匹配是使用case folding實(shí)現(xiàn)的,,該過程將串映射為一種消除了大小寫差異的規(guī)范形式,。Case folding顧及到查找中的不分大小寫的快速匹配,因?yàn)橹恍枰M(jìn)制比較,。它不僅僅是只轉(zhuǎn)換為小寫形式,。
通常,初始的串不會(huì)被轉(zhuǎn)換的串替代,,因?yàn)檫@樣的替代可能會(huì)抹掉重要的信息。例如,,名字"Marco di Silva"轉(zhuǎn)換為"marco di silva",,失去了關(guān)于哪個(gè)字母是大寫的信息。
在Unicode Character Database(UCD)中的文件CaseFolding.txt用于執(zhí)行與地區(qū)無關(guān)的case folding,。該文件是通過單字符映射和多字符映射,,從UCD中的case mapping生成的。它將所有具有不同case形式的字符轉(zhuǎn)換成一個(gè)普通形式,。對(duì)兩個(gè)串進(jìn)行不分大小寫的比較時(shí),,可以利用這些數(shù)據(jù)對(duì)串進(jìn)行轉(zhuǎn)換,,在使用 二進(jìn)制比較。 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多