Unicode雙向算法(二)

注:本翻譯使用符號(hào)「」來(lái)突出某些可能會(huì)產(chǎn)生歧義的名詞酪碘。
目前狀態(tài):勘誤中蕾盯。


Unicode?標(biāo)準(zhǔn)附錄#9

UNICODE雙向算法#####
版本 Unicode 8.0.0
編者 Mark Davis, Aharon Lanin, and Andrew Glass
日期 2015-05-29
當(dāng)前版本 http://www.unicode.org/reports/tr9/tr9-33.html
當(dāng)前版本 http://www.unicode.org/reports/tr9/tr9-31.html
以前版本 http://www.unicode.org/reports/tr9/tr9-31.html
最新版本 http://www.unicode.org/reports/tr9/
提出的更新 http://www.unicode.org/reports/tr9/proposed.html
修正 33

目錄#####

├ 1 引言
├ 2 定向格式化字符
│├ 2.1 顯式定向嵌入
│├ 2.2 顯式定向重寫
│├ 2.3 終止顯式定向嵌入和重寫
│├ 2.4 顯式定向隔離
│├ 2.5 終止顯式定向隔離
│├ 2.6 隱式定向標(biāo)記
│└ 2.7 標(biāo)記和格式化字符
├ 3 基本顯示算法
│├ 3.1 定義
││├ 3.1.1 基礎(chǔ)BD1BD2目锭,BD3湃鹊,BD4BD5BD6枪汪,BD7
││├ 3.1.2 匹配顯式定向格式化字符BD8涌穆,BD9BD10雀久,
│││    BD11宿稀,BD12BD13
││├ 3.1.3 成對(duì)括號(hào)BD14赖捌,BD15祝沸,BD16
││└ 3.1.4 其他縮略語(yǔ)縮略語(yǔ)翻譯
│├ 3.2 雙向字符類型
│├ 3.3 解析嵌入層次level是層次還是等級(jí)?
││├ 3.3.1 分段層次P1越庇,P2罩锐,P3
││├ 3.3.2 顯式層次和方向X1X2卤唉,X3涩惑,X4X5桑驱,X5A竭恬,
│││    X5bX5c熬的,X6痊硕,X6AX7押框,X8
││├ 3.3.3 隱式處理的準(zhǔn)備X9岔绸,X10
││├ 3.3.4 分析弱類型W1W2W3亭螟,W4挡鞍,W5W6预烙,W7
││├ 3.3.5 分析中性類型和隔離格式化類型N0墨微,N1N2隔離格式化扁掸?
││└ 3.3.6 分析隱式層次I1翘县,I2
│├ 3.4 分析重排序?qū)哟?/a>: L1L2谴分,L3锈麸,L4
│└ 3.5 成型定型?翻譯
├ 4 雙向一致性
│├ 4.1 中性邊界
│├ 4.2 顯式格式化字符
│├ 4.3 高層協(xié)議HL1牺蹄,HL2忘伞,HL3HL4沙兰,HL5氓奈,HL6高等級(jí)協(xié)議
│└ 4.4 雙向一致性測(cè)試
├ 5 實(shí)現(xiàn)說(shuō)明
│├ 5.1 參考代碼
│└ 5.2 保留的BN和顯式格式化字符保留還是確定
├ 6 用法
│├ 6.1 結(jié)合
│├ 6.2 豎排文本
│├ 6.3 格式化
│├ 6.4 分離標(biāo)點(diǎn)符號(hào)
│└ 6.5 轉(zhuǎn)換為純文本
├ 7 鏡像
遷移問(wèn)題
│└部分重組
致謝
參考
修改


3.3.3 隱式處理的準(zhǔn)備
通過(guò)之前的規(guī)則,顯式嵌入水平已被分配給字符鼎天,在字符的隱式雙向類型的基礎(chǔ)上舀奶,顯式嵌入將作進(jìn)一步調(diào)整。對(duì)于一個(gè)給定字符的調(diào)整斋射,將依賴于它周圍的字符育勺。然而,這種依賴性會(huì)被如下規(guī)則界定: 在邏輯上將分段分成子單元罗岖,獨(dú)立地對(duì)每個(gè)單元進(jìn)行后續(xù)的隱式處理限制涧至。
X9. 移除所有的RLE,LRE桑包,RLO化借,LRO,PDF和BN字符。
注意:這個(gè)實(shí)現(xiàn)并沒(méi)有真正刪除那些字符捡多,只是在后面的算法中蓖康,字符表現(xiàn)得不存在一樣。只要其他字符正確排序垒手,一致性不對(duì)字符作特殊的規(guī)定蒜焊。
參閱章節(jié)5,執(zhí)行注釋科贬,有關(guān)執(zhí)行該算法而不需要?jiǎng)h除格式化字符的資料泳梆。
零寬度連接器(zero width joiner)和非連接器(non-joiner)影響相鄰字符(即使這些字符在雙向算法中重排序后可能變得不相鄰鳖悠,字符在最初存儲(chǔ)器中的順序相鄰即可)的成型,具體可參閱章節(jié)6.1优妙,連接符乘综。
注意:FSI,LRI套硼,RLI和PDI 字符沒(méi)有被移除卡辰。正如下列規(guī)則指出的,在某種程度上邪意,它們被用于確定分段的隔離運(yùn)行序列九妈,其中,它們會(huì)被看作是中性字符雾鬼。當(dāng)然萌朱,它們是像LRM和RLM這類的零寬度字符,在最后輸出中不可見(jiàn)策菜。
X10. 執(zhí)行以下步驟:
按BD13指定的計(jì)算隔離運(yùn)行序列的集合晶疼,基于字符的雙向類型和上面規(guī)則(X1-X9)賦值的嵌入等級(jí)。
對(duì)每個(gè)隔離運(yùn)行序列又憨,確定分段的起點(diǎn)(start-of-sequence翠霍,簡(jiǎn)稱sos)和分段的終點(diǎn)(end-of-sequence,簡(jiǎn)稱eos)類型竟块,L或R其中之一壶运。這取決于在序列邊界兩側(cè)的兩個(gè)等級(jí)更高的那個(gè):
對(duì)于sos耐齐,序列中第一個(gè)字符的等級(jí)與分段內(nèi)sos前面的字符(不包括被X9移除的字符)等級(jí)比較浪秘,如果找不到sos前面的字符,則是與分段嵌入等級(jí)比較埠况。
對(duì)于eos耸携,序列中最后字符的等級(jí)與分段內(nèi)soe后面的字符(不包括被X9移除的字符)等級(jí)比較,如果找不到soe后面的字符或序列的最后字符是隔離啟動(dòng)器(缺少一個(gè)匹配的PDI)辕翰,則是與分段嵌入等級(jí)比較夺衍。
如果最高的級(jí)別是奇數(shù),sos或eos是R喜命,否則是L沟沙。
注意這個(gè)計(jì)算必須用到上面規(guī)則所賦值的嵌入等級(jí),下面的步驟執(zhí)行產(chǎn)生的變化壁榕。
應(yīng)用規(guī)則W1-W7矛紫,N0-N2和I1-I2,對(duì)每個(gè)隔離運(yùn)行序列牌里,按照序列出現(xiàn)的順序颊咬,對(duì)序列中的所有字符,按照字符在序列中的順序,且對(duì)序列的任意部分應(yīng)用其他規(guī)則之前喳篇,應(yīng)用一條規(guī)則敞临。對(duì)每個(gè)隔離運(yùn)行序列順序的處理都很類似。當(dāng)對(duì)一個(gè)隔離運(yùn)行序列應(yīng)用一條規(guī)則時(shí)麸澜,隔離運(yùn)行序列中每個(gè)運(yùn)行等級(jí)的最后一個(gè)字符均被看作字符的后面會(huì)緊接著序列中下一運(yùn)行等級(jí)的第一個(gè)字符(無(wú)論是否存在這個(gè)字符)挺尿。
這里有幾個(gè)例子,其中每個(gè)texti被假定為是一個(gè)基礎(chǔ)等級(jí)為0和內(nèi)部無(wú)字符序列的分段痰憎,texti包含了顯式定向格式化字符或分段分隔符票髓。例子中的點(diǎn)號(hào)是為了視覺(jué)清晰把元素分開(kāi),它們不是文本的一部分铣耘。
例1:
text1·RLE·text2·LRE·text3·PDF·text4·PDF·RLE·text5·PDF·text6

隔離運(yùn)行序列 嵌入等級(jí) sos eos
text1 0 L R
text2 1 R L
text3 2 L L
text4·text5 1 L R
text6 0 R L

例2: text1·RLI·text2·LRI·text3·PDI·text4·PDI·RLI·text5·PDI·text6

隔離運(yùn)行序列 嵌入等級(jí) sos eos
text1·RLI·PDI·RLI·PDI·text6 0 L L
text2·LRI·PDI·text4 1 R R
text3 2 L L
text5 1 R R

例3: text1·RLE·text2·LRI·text3·RLE·text4·PDI·text5·PDF·text6

隔離運(yùn)行序列 嵌入等級(jí) sos eos
text1 0 L R
text2·LRI·PDI·text5 1 R R
text3 2 L R
text4 3 R R
text6 0 R L

3.3.4 解析弱類型
首先洽沟,每個(gè)無(wú)間距標(biāo)記(nonspacing mark,簡(jiǎn)稱NSM)的解析是基于它后面的字符。
W1.在每個(gè)隔離運(yùn)行序列中檢查每個(gè)NSM蜗细,如果前一個(gè)字符是隔離啟動(dòng)器或PDI裆操,將NSM的類型更改為其他中性的,否則類型更改為與前一個(gè)字符相同炉媒。如果NSM是隔離運(yùn)行序列的第一個(gè)字符踪区,NSM的類型將是sos。(注意吊骤,在一個(gè)隔離運(yùn)行序列中缎岗,一個(gè)隔離啟動(dòng)器后面是一個(gè)NSM或任何非PDI類型,那么這個(gè)隔離啟動(dòng)器就是一個(gè)溢出隔離啟動(dòng)器白粉。)
這個(gè)例子中传泊,假設(shè)SOS是R:<pre><b>AL NSM NSM → AL AL AL
sos NSM → sos R
LRI NSM → LRI ON
PDI NSM → PDI ON</b></pre>下一步是解析數(shù)字。這階段會(huì)將雙向類型歐洲數(shù)字分隔符鸭巴、歐洲數(shù)字終止符和普通數(shù)字分隔符變更為歐洲數(shù)字文本眷细,或者其他中性文本。對(duì)于已經(jīng)被掃描的文本鹃祖,它的類型可能已經(jīng)被定向重寫改變溪椎。如果是這樣,那么就不會(huì)解析為數(shù)字。
W2.從每個(gè)歐洲數(shù)字的實(shí)例反向搜索直到找到第一個(gè)強(qiáng)類型(R恬口,L或sos)校读。如果找到AL,將歐洲數(shù)字的類型變更為阿拉伯?dāng)?shù)字祖能。<pre><b>AL EN → AL AN
AL NI EN → AL NI AN
sos NI EN → sos NI EN
L NI EN → L NI EN
R NI EN → R NI EN</b></pre>W3.強(qiáng)所有AL類型變更為R歉秫。
W4.在兩個(gè)歐洲數(shù)字之間的唯一的歐洲數(shù)字分隔符變更為歐洲數(shù)字。兩個(gè)同一類型的數(shù)字之間的唯一普通分隔符變更為該類型芯杀。<pre>EN ES EN → EN EN EN
EN CS EN → EN EN EN
AN CS AN → AN AN AN</pre>W5.與歐洲數(shù)字相鄰的歐洲數(shù)字分隔符變更為歐洲數(shù)字端考。<pre>
ET ET EN → EN EN EN
EN ET ET → EN EN EN
AN ET EN → AN EN EN
</pre>W6.否則雅潭,分隔符和終止符變更為其他中性類型。<pre>AN ET → AN ON
L ES EN → L ON EN
EN CS AN → EN ON AN
ET AN → ON AN</pre>W7.從每個(gè)歐洲數(shù)字開(kāi)始却特,反向搜索直到找到第一個(gè)強(qiáng)類型(R扶供,L或sos)。如果找到L裂明,則將歐洲數(shù)字的類型變更為L(zhǎng)椿浓。<pre>L NI EN → L NI L
R NI EN → R NI EN</pre>3.3.5 解析中性類型和隔離格式化類型
在下一階段,在一個(gè)隔離運(yùn)行序列中闽晦,進(jìn)行一次中性和隔離格式化(即 NI)字符的解析扳碍。這將導(dǎo)致所有NI變更為R或L。一般來(lái)說(shuō)仙蛉,NI類型由其周圍的文本決定笋敞。萬(wàn)一發(fā)生沖突,NI類型由定向嵌入決定荠瘪。 At isolating run sequence boundaries where the type of the character on the other side of the boundary is required, the type assigned to sos or eos is used.在隔離運(yùn)行序列中的一對(duì)括號(hào)被當(dāng)作單元來(lái)處理夯巷,這樣開(kāi)括號(hào)和閉括號(hào)均被解析為同一方向。注意這條規(guī)則是基于每對(duì)括號(hào)的當(dāng)前定向字符類型而不是原始類型哀墓,同時(shí)這可能在規(guī)則X6下發(fā)生了改變趁餐。The current bidirectional character type may also have changed under a previous iteration of the for loop in N0 in the case of nested bracket pairs.
N0.

使用下面給出的邏輯處理在開(kāi)括號(hào)的文本位置的邏輯順序的一個(gè)隔離運(yùn)行序列中的對(duì)括號(hào)。在范圍內(nèi)篮绰,雙向類型EN和AN看作R后雷。
根據(jù)BD16,識(shí)別在當(dāng)前隔離運(yùn)行序列中的對(duì)括號(hào)
對(duì)于每個(gè)在文本位置的列表中的每個(gè)對(duì)括號(hào)元素:
a.檢查在對(duì)括號(hào)內(nèi)所包含的字符的雙向類型吠各。
b.如果發(fā)現(xiàn)任何匹配了嵌入方向的強(qiáng)類型(L或R)臀突,將對(duì)括號(hào)的類型設(shè)置為嵌入方向。<pre>o [ e ] o → o e e e o
o [ o e ] → o e o e e
o [ NI e ] → o e NI e e</pre>c.否則走孽,如果這里有一個(gè)強(qiáng)類型惧辈,它必須是與嵌入方向相反琳状。因此磕瓷,帶著上述的強(qiáng)類型,測(cè)試一個(gè)確定的上下文念逞,通過(guò)在開(kāi)括號(hào)的前面開(kāi)始反向檢查困食,直到發(fā)現(xiàn)第一個(gè)強(qiáng)類型(L,R或sos)翎承。
1.如果上述的強(qiáng)類型也是與嵌入方向相反硕盹,上下文被確定,因此叨咖,將對(duì)括號(hào)設(shè)置成該方向瘩例。<pre>o [ o ] e → o o o o e
o [ o NI ] o → o o o NI o o</pre>2.否則將對(duì)括號(hào)設(shè)置成嵌入方向啊胶。<pre>e [ o ] o → e e o e o
e [ o ] e → e e o e e</pre>d.否則,在對(duì)括號(hào)里沒(méi)有強(qiáng)類型垛贤。因此焰坪,對(duì)括號(hào)不設(shè)置類型。<pre>e ( NI ) o → e ( NI ) o</pre>注意聘惦,如果封閉的文本里沒(méi)有強(qiáng)字符某饰,括號(hào)會(huì)逐一使用規(guī)則N1和N2來(lái)解析到相同的等級(jí)。
無(wú)論有多少個(gè)字符善绎,只要字符含有原始雙向字符類型NSM黔漂,該NSM優(yōu)先應(yīng)用規(guī)則W1,且NSM后面緊跟在規(guī)則N0下變更為L(zhǎng)或R對(duì)括號(hào)禀酱,那么字符應(yīng)該變更為匹配它們之前括號(hào)的類型炬守。
例1.從邏輯順序的開(kāi)括號(hào)位置開(kāi)始,依次解析對(duì)括號(hào)剂跟。
(RTL分段方向)

Storage AB ( CD [ & ef ] ! ) gh
Bidi_Class R ON R ON ON L ON ON ON L
N0 applied (first pair) N0b: ON→R N0b: ON→R
N0 applied (second pair) N0c2: ON→R N0c2: ON→R
Display gh(![ef&]DC)BA

例2.括號(hào)對(duì)內(nèi)包含混合強(qiáng)類型則選取分段方向劳较。
(RTL分段方向)

Storage smith ( fabrikam ARABIC ) HEBREW
Bidi_Class L WS ON L WS R ON WS R
N0 applied N0b: ON→R N0b: ON→R
Display WERBEH (CIBARA fabrikam) smith

注意,在上面例子中浩聋,如果smith與HEBREW或fabrikam與ARABIC的順序調(diào)換观蜗,對(duì)括號(hào)的解析仍然不變。
例3.對(duì)括號(hào)內(nèi)包含與嵌入方向相反的強(qiáng)類型with additional strong-type context衣洁,選取與嵌入方向相反的方向墓捻。
(RTL分段方向)

||||||||
|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|
|Storage|ARABIC||book|(|s|)|
|Bidi_Class|R|WS|L|ON|L|ON|
|N0 applied||||N0c1: ON→L||N0c1: ON→L|
|Display|book(s) CIBARA||||||
N1.如果NI兩邊的文本具有相同的方向,那么NI選取周圍的強(qiáng)文本方向坊夫。在對(duì)NI的影響方面砖第,歐洲數(shù)字和阿拉伯?dāng)?shù)字表現(xiàn)得像R類型一樣。sos和eos類型用于隔離運(yùn)行序列邊界上环凿。<pre> L NI L → L L L
R NI R → R R R
R NI AN → R R AN
R NI EN → R R EN
AN NI R → AN R R
AN NI AN → AN R AN
AN NI EN → AN R EN
EN NI R → EN R R
EN NI AN → EN R AN
EN NI EN → EN R EN</pre>
N2.剩下的NI選取嵌入方向梧兼。<pre>NI → e</pre>對(duì)于給定的NI字符的嵌入方向,是來(lái)源于它的嵌入等級(jí):如果字符被設(shè)置偶數(shù)等級(jí)智听,則為L(zhǎng)羽杰,如果是奇數(shù)等級(jí),則為R到推。(參閱BD3.)
在以下例子中考赛,假定eos是L類型,sos是R類型莉测。應(yīng)用N1和N2后如下:<pre>L NI eos → L L eos
R NI eos → R e eos
sos NI L → sos e L
sos NI R → sos R R</pre>
一列數(shù)字被中性字符隔開(kāi)和嵌入在定向運(yùn)行中颜骤,它會(huì)出現(xiàn)在運(yùn)行的順序中。<pre>Storage: he said "THE VALUES ARE 123, 456, 789, OK".
Display: he said "KO ,789 ,456 ,123 ERA SEULAV EHT".</pre>
在這個(gè)例子中捣卤,逗號(hào)和空格均在數(shù)字之間忍抽,它們忽略數(shù)字并獲取周圍文本的方向(大寫字符即right-to-left)八孝。逗號(hào)不用考慮數(shù)字部分,因?yàn)樗鼈兊膬蓚?cè)不是被數(shù)字包圍(參閱章節(jié)3.3.4鸠项,解析弱類型)唆阿。然而,如果前面有一個(gè)left-to-right序列锈锤,歐洲數(shù)字會(huì)采取如下方向:<pre>Storage: IT IS A bmw 500, OK.
Display: .KO ,bmw 500 A SI TI</pre>
3.3.6 解析隱式層次
在最后階段,基于已被解析的字符類型驯鳖,文本的嵌入等級(jí)可能增加。Right-to-left文本總是以奇數(shù)等級(jí)結(jié)束久免,left-to-right和中性的文本總是以偶數(shù)等級(jí)結(jié)束浅辙。此外,數(shù)字的文本總是以比分段等級(jí)高的等級(jí)結(jié)束阎姥。(注意记舆,在這過(guò)程中,文本以max_depth+1等級(jí)結(jié)束是可能的呼巴。)這將導(dǎo)致以下規(guī)則:
I1.對(duì)于所有在偶數(shù)(left-to-right)嵌入等級(jí)的字符泽腮,那些類型為R的提升一個(gè)等級(jí),那些類型為AN或EN的提升兩個(gè)等級(jí)衣赶。
I2.對(duì)于所有在奇數(shù)(right-to-left)嵌入等級(jí)的字符诊赊,那些類型為L(zhǎng),EN或AN的提升一個(gè)級(jí)別府瞄。
表格5歸納了隱式算法的結(jié)果碧磅。

|類型|嵌入水平|嵌入水平|
|:--|:--|:--|:--|:--|
||偶數(shù)|奇數(shù)|
|L|EL|EL+1|
|R|EL+1|EL|
|AN|EL+2|EL+1|
|EN|EL+2|EL+1|
3.4 重排序已被解析的等級(jí)
以下規(guī)則描述了尋找正確的顯示順序的邏輯過(guò)程。相對(duì)于解析階段遵馆,these rules act on a per-line basis and are applied after any line wrapping is applied to the paragraph.
邏輯上有以下幾個(gè)步驟:
文本等級(jí)由前面的規(guī)則確定鲸郊。
字符根據(jù)它們的上下文(對(duì)鏡像考慮嵌入等級(jí))成型。
這些字形(按邏輯順序)的累計(jì)寬度被用與確定換行货邓。
對(duì)于每一行秆撮,規(guī)則L1-L4被用于重排序該行上的字符。
對(duì)應(yīng)行中字符的字形的顯示换况。
L1.在每一行中职辨,將以下字符的嵌入等級(jí)重置成分段嵌入等級(jí):
1.段分隔符,
2.分段分隔符复隆,
3.任何在段分隔符或分段分隔符前面的空白字符和/或隔離格式化字符(FSI拨匆,LRI姆涩,RLI和PDI)序列挽拂,和
4.任何在行的結(jié)尾的空白字符和/或隔離格式化字符(FSI,LRI骨饿,RLI和PDI)序列亏栈。
這里所使用的字符類型是原始類型台腥,不是被以前階段修改過(guò)的類型。
因?yàn)榉侄畏指舴麜?huì)中斷行绒北,在每行中最多有一個(gè)在該行的結(jié)尾黎侈。
結(jié)合以下規(guī)則,這意味著尾隨的空白字符將出現(xiàn)該行的視覺(jué)結(jié)束位置(分段方向)闷游。分段中的制表符總有一個(gè)連貫的方向峻汉。
L2.在文本中發(fā)現(xiàn)的最高等級(jí)到每行中最低的奇數(shù)等級(jí),包括中間等級(jí)脐往,這些等級(jí)實(shí)際上并不存在于文本中休吠,顛倒字符在該等級(jí)或更高的所有相鄰序列
這條規(guī)則反向逐步增大的子串。
以下例子說(shuō)明重排序业簿,展示應(yīng)用規(guī)則L2的連續(xù)步驟喝峦。原始文本展示在表格里行“存儲(chǔ)器(Storage)”中成翩。無(wú)形的,零寬度格式化字符LRI,RLI和PDI分別使用>册烈,<,=號(hào)來(lái)代替陨献。章節(jié)3.3爪膊,解析嵌入等級(jí)和規(guī)則L1的應(yīng)用所生成的已被解析等級(jí)展示在行“已被解析等級(jí)(Resolved Levels)”中。(由于這些例子只是利用隔離格式化字符缰揪,規(guī)則X9不會(huì)移除任何字符亡脑。注意,如果使用嵌入來(lái)替代邀跃,例3將不起作用霉咨,因?yàn)閮蓚€(gè)right-to-left短語(yǔ)會(huì)連同中性標(biāo)點(diǎn)合并成一個(gè)right-to-left運(yùn)行。)拍屑。此后途戒,每一個(gè)連續(xù)的行按規(guī)則L2展示一遍逆轉(zhuǎn),例如“反向等級(jí)1-2”.在每次反向中僵驰,下劃線表示該段文本已經(jīng)被反向喷斋。
例1,例2,例3的分段嵌入等級(jí)為0(left-to-right方向)蒜茴,例4為1(right-to-left方向)星爪。
例1.(嵌入等級(jí)=0)<pre><b>Storage: car means CAR.
Resolved levels: 00000000001110
Reverse level 1: car means <u>RAC</u>.
Display: car means RAC</b></pre>
例2.(嵌入等級(jí)=0)<pre><b>
Storage: <car MEANS CAR.=
Resolved levels: 0222111111111110
Reverse level 2: <<u>rac</u> MEANS CAR.=
Reverse levels 1-2: <<u>.RAC SNAEM car</u>=
Display: .RAC SNAEM car
</b></pre>
例3.(嵌入等級(jí)=0)<pre><b>
Storage: he said “<car MEANS CAR=.” “<IT DOES=,” she agreed.
Resolved levels: 000000000022211111111110000001111111000000000000000
Reverse level 2: he said “<<u>rac</u> MEANS CAR=.” “<IT DOES=,” she agreed.
Reverse levels 1-2: he said “<<u>RAC SNAEM car</u>=.” “<<u>SEOD TI</u>=,” she agreed.
Display: he said “RAC SNAEM car.” “SEOD TI,” she agreed.
</b></pre>
例4.(嵌入等級(jí)=1)<pre><b>
Storage: DID YOU SAY ’>he said “<car MEANS CAR=”=‘?
Resolved levels: 111111111111112222222222444333333333322111
Reverse level 4: DID YOU SAY ’>he said “<rac MEANS CAR=”=‘?
Reverse levels 3-4: DID YOU SAY ’>he said “<RAC SNAEM car=”=‘?
Reverse levels 2-4: DID YOU SAY ’>”=rac MEANS CAR<“ dias eh=‘?
Reverse levels 1-4: ?‘=he said “<RAC SNAEM car=”>’ YAS UOY DID
Display: ?‘he said “RAC SNAEM car”’ YAS UOY DID
</b></pre>
L3.在這點(diǎn)上,應(yīng)用在right-toleft基本字符(base character)的組合標(biāo)記(Combining marks)優(yōu)于它們的基本字符粉私。如果渲染引擎希望它們?cè)谧詈笳故玖鞒讨懈S基本字符顽腾,則標(biāo)記的順序和基本字符必須顛倒。Many font designers provide default metrics for combining marks that support rendering by simple overhang. Because of the reordering for right-to-left characters, it is common practice to make the glyphs for most combining characters overhang to the left (thus assuming the characters will be applied to left-to-right base characters) and make the glyphs for combining characters in right-to-left scripts overhang to the right (thus assuming that the characters will be applied to right-to-left base characters). With such fonts, the display ordering of the marks and base glyphs may need to be adjusted when combining marks are applied to “unmatching” base characters. See Section 5.13, Rendering Nonspacing Marks of [Unicode], for more information.
L4.當(dāng)且僅當(dāng)已被解析的字符方向是R、字符的Bidi_Mirrored屬性值是Yes時(shí)抄肖,該字符由一個(gè)鏡像字形描述久信。
BIdi_Mirrored屬性在[Unicode]的章節(jié)4.7,Bidi Mirrored中定義漓摩;屬性值在[UCD]中詳細(xì)說(shuō)明裙士。
這條規(guī)則可以在某些情況下被覆蓋;參閱HL6.
例如管毙,U+0028左圓括號(hào)(LEFT PARENTHESIS)腿椎,它在Unicode Standard中翻譯為開(kāi)放的圓括號(hào),當(dāng)它解析后的等級(jí)為偶數(shù)夭咬,顯示為“(”,當(dāng)它解析后的等級(jí)為奇數(shù)酥诽,顯示為“)”。注意皱埠,為了向后兼容字符U+FD3E“?”裝飾的左括號(hào)(ORNATE LEFT PARENTHESIS)和U+FD3F“?”裝飾的右括號(hào)(ORNATE RIGHT PARENTHESIS肮帐,它們沒(méi)有鏡像。
3.5 成型
手寫連接的語(yǔ)言边器,例如阿拉伯語(yǔ)或敘利亞語(yǔ)训枢,需要選擇位置的字符形狀,會(huì)依賴于鄰近的字符(參閱[Unicode]的章節(jié)8.2忘巧,Arabic)恒界。在雙向算法的規(guī)則I2后應(yīng)用成型,成型受到相同運(yùn)行等級(jí)內(nèi)的字符限制砚嘴。(注意十酣,限制的整形對(duì)一個(gè)運(yùn)行等級(jí)和一個(gè)隔離運(yùn)行序列沒(méi)有實(shí)際的差異,是因?yàn)楦綦x啟動(dòng)器和PDI字符被定義去加入類型U际长,即非鏈接(non-joining)耸采。因此,定向隔離前后的字符不會(huì)連接隔離工育,即使隔離是空的或溢出深度限制虾宇。)參考以下例子,阿拉伯字符串如绸,在內(nèi)存中作為字符1,2,3和4表示嘱朽,并且其中前兩個(gè)字符是LTR方形的重寫。同時(shí)顯示分段方向怔接,后兩個(gè)字符是RTL方向的嵌入搪泳。

|1|2|3|4|
|:--:|:--:|:--:|:--:|:--:|
|<b>?</b>|<b>?</b>|<b>?</b>|<b>?</b>|
|062C|0639|0644|0645|
|JEEM|AIN|LAM|MEEM|
|L|L|R|R|
在HTML中的文本或使用,
在純文本中使用顯式定向格式化字符扼脐,或者在HTML中使用標(biāo)記岸军,均可達(dá)到這個(gè)效果,例子如下。(粗體文本是right-to-left的分段方向凛膏。)
LRM/RLM LRO JEEM AIN PDF RLO LAM MEEM PDF

<p dir="ltr"/"rtl">LRO JEEM AIN PDF RLO LAM MEEM PDF</p>
<p dir="ltr"/"rtl"><bdo dir="ltr">JEEM AIN</bdo>
<bdo dir="rtl">LAM MEEM</bdo></p>
根據(jù)分段方向杨名,所得的形狀如下:

Left-Right Paragraph

|||||
|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|
|1|2|4|3|
|<b>?</b>|<b>?</b>|<b>?</b>|<b>?</b>|
|JEEM-F|AIN-I|MEEM-F|LAM-I|
Right-Left Paragraph

|||||
|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|
|4|3|1|2|
|<b>?</b>|<b>?</b>|<b>?</b>|<b>?</b>|
|MEEM-F|LAM-I|JEEM-F|AIN-I|
3.5.1 成型和斷行
將分段分成符合特定邊界的一行或多行的過(guò)程超出了雙向算法的范圍脏榆。當(dāng)字符成型參與時(shí)猖毫,寬度計(jì)算必須基于字形的形狀。
注意须喂,軟連字符(soft-hyphen吁断,簡(jiǎn)稱SHY)插入到手寫連接語(yǔ)言時(shí)與插入到其他語(yǔ)言一樣。也就是說(shuō)坞生,它指出了一點(diǎn)仔役,在該點(diǎn)上單詞的中間可以中斷該行。如果渲染系統(tǒng)在該點(diǎn)上中斷是己,對(duì)于給定的語(yǔ)言又兵,顯示(包括成型)應(yīng)該是恰當(dāng)?shù)摹jP(guān)于這些和其他斷行問(wèn)題的更多信息卒废,見(jiàn)附件# Unicode標(biāo)準(zhǔn)14沛厨,“斷行特性”[UAX14]。
雙向一致性
雙向算法指定部分right-to-left字符的內(nèi)在語(yǔ)義摔认,因此需要與Unicode Standard中顯示的任何字符保持一致性逆皮。
與本規(guī)范保持一致性的過(guò)程應(yīng)滿足下列條款:
UAX9-C1.在沒(méi)有允許的更高級(jí)別的協(xié)議下,渲染文本的過(guò)程應(yīng)該在順序描述中顯示出所有列出的可見(jiàn)的字符(不包括格式化字符)参袱,參閱章節(jié)3电谣,Basic Display Algorithm。此外抹蚀,這包括定義BD1-BD16和步驟P1-P3剿牺,X1-X10,W1-W7环壤,N0-N2牢贸,I1-I2,和L1-L4镐捧。
如同所有其他的Unicode算法潜索,只要他們產(chǎn)生相同的結(jié)果,這一邏輯描述在特定實(shí)現(xiàn)下可以有更高效的機(jī)制懂酱。參[Unicode]第三章Conformance竹习,注意事項(xiàng)如下。
UAX9-C2.唯一允許更高級(jí)別的協(xié)議在4.3節(jié)列牺,Higher-Level Protocols中列出整陌。他們是HL1、HL2、3泌辫,4随夸,5,和HL6震放。
注意:不鼓勵(lì)使用更高級(jí)別的協(xié)議是因?yàn)樗肓私粨Q問(wèn)題宾毒,并可能導(dǎo)致安全問(wèn)題。有關(guān)更多信息殿遂,參見(jiàn)Unicode的技術(shù)報(bào)告# 36诈铛、“Unicode Security Considerations”[UTR36]。
4.1 中性邊界
標(biāo)記一個(gè)格式化字符或控制字符為BN的目的它對(duì)算法的其余部分不產(chǎn)生影響墨礁。(ZWJ和ZWNJ是例外幢竹;參閱X9)。相對(duì)于其它字符恩静,一致性并不要求對(duì)格式化字符進(jìn)行精確地排序焕毫,只要它們保留其他字符的順序時(shí),可以用不同的方式來(lái)處理它們驶乾。
4.2 顯式格式化字符
就Unicode字符來(lái)說(shuō)邑飒,系統(tǒng)不必支持所有的顯式定向格式化字符(雖然一般只含有一個(gè)終止字符而不含啟動(dòng)器是沒(méi)用的)。
一般情況下轻掩,一致性系統(tǒng)將分為四類:
無(wú)雙向性格式化幸乒。這意味著系統(tǒng)并不能直觀地解釋right-to-left語(yǔ)言的字符。
隱式雙向性唇牧。這意味著支持雙向算法和定向標(biāo)記ALM罕扎,RLM和LRM。
無(wú)隔離雙向性丐重。這意味著支持雙向算法腔召,隱式定向標(biāo)記,顯式非隔離定向格式化字符ALM扮惦,RLM臀蛛,LRM,LRE崖蜜,RLE浊仆,LRO,RLO豫领,PDF抡柿。
完整的雙向性。這意味著支持雙向算法等恐,隱式定向標(biāo)記洲劣,顯式定向格式化字符ALM备蚓,RLM,LRM囱稽,LRE郊尝,RLE,LRO战惊,RLO流昏,PDF,F(xiàn)SI样傍,LRI横缔,RLI铺遂,PDI衫哥。
4.3 高級(jí)協(xié)議
下列條款是系統(tǒng)對(duì)雙向文本的排序,應(yīng)用更高級(jí)別的協(xié)議唯一允許的方式襟锐。部分條款適用于結(jié)構(gòu)化文本段撤逢。這指的是文本被解析為結(jié)構(gòu)化時(shí),無(wú)論是帶有顯式標(biāo)記的例如XML或HTML粮坞,或是不帶顯式標(biāo)記的內(nèi)部結(jié)構(gòu)化如文字處理器或電子表格蚊荣。在這種情況下,一個(gè)段的范圍是通過(guò)結(jié)構(gòu)用某種方式來(lái)區(qū)分莫杈。
HL1互例。重寫P3,并顯式地設(shè)置分段嵌入等級(jí)筝闹。當(dāng)在規(guī)則X5c中決定怎樣對(duì)待FSI時(shí)媳叨,本規(guī)則不會(huì)被應(yīng)用。
更高級(jí)別的協(xié)議可能設(shè)置所有分段等級(jí)关顷。這可以在上下文的基礎(chǔ)上進(jìn)行糊秆,例如在一個(gè)表格單元格,分段议双,文檔或系統(tǒng)等級(jí)痘番。(如果P3被重寫,P2可能會(huì)被跳過(guò))平痰。注意汞舱,這不允許更高級(jí)別的協(xié)議來(lái)重寫B(tài)D2中指定的限制。
一個(gè)更高級(jí)別的協(xié)議可能應(yīng)用相當(dāng)于P2和P3的規(guī)則宗雇,但默認(rèn)為1級(jí)(RTL)而不是0級(jí)(LTR)昂芜,以適應(yīng)整體的RTL環(huán)境。
更高級(jí)別的協(xié)議可能會(huì)使用完全不同的算法逾礁,基于分段文本和內(nèi)容上说铃,啟發(fā)式地自動(dòng)檢測(cè)分段嵌入等級(jí)访惜。例如,它可以將它基于是否在文本中RTL字符比LTR多腻扇。作為另一個(gè)例子债热,當(dāng)分段不含有強(qiáng)字符,其方向可以由分段之前或之后的等級(jí)確定幼苛。
HL2.重寫W2窒篱,顯式地設(shè)置EN或AN。
更高級(jí)別的協(xié)議可能將字符的EN類型重置為AN類型舶沿,反之亦然墙杯,并忽略W2。例如括荡,樣式表或標(biāo)記信息可以用在文本范圍內(nèi)高镐,來(lái)將設(shè)置為EN的文本重寫為AN,反之亦然畸冲。
HL3嫉髓。模擬顯式定向格式化字符。
更高級(jí)別的協(xié)議可以對(duì)在結(jié)構(gòu)化段落施加定向嵌入邑闲,隔離和重寫的作用算行。該行為必須通過(guò)參考,如果同等的在算法中定義的顯式定向格式化字符被插入到文本會(huì)發(fā)生什么來(lái)定義苫耸。例如州邢,樣式表或標(biāo)記信息可以修改文本范圍內(nèi)的嵌入等級(jí)。
HL4褪子。對(duì)段落應(yīng)用雙向算法量淌。
雙向算法可以被單獨(dú)地應(yīng)用在一個(gè)或多個(gè)結(jié)構(gòu)化段落中。例如褐筛,當(dāng)在編輯器中顯示一個(gè)包含文本數(shù)據(jù)和可見(jiàn)標(biāo)記的文檔時(shí)类少,更高級(jí)別的協(xié)議可以從文本數(shù)據(jù)中,分別處理標(biāo)記中的語(yǔ)法元素渔扎。
HL5硫狞。提供人為的上下文。
文本可以通過(guò)雙向算法進(jìn)行處理晃痴,就好像文本的前面或后面是一個(gè)給定類型的字符残吩。這允許從文本中的長(zhǎng)段落提取出一片文本來(lái)表現(xiàn)出該片文本在更大的上下文中。
HL6倘核。額外的鏡像泣侮。
沒(méi)有Bidi_Mirrored屬性的某些字符也可以通過(guò)在專門上下文的鏡像圖像字符描述。這些上下文包括但不限于紧唱,歷史上的語(yǔ)言和相關(guān)的標(biāo)點(diǎn)活尊,私人使用的字符和數(shù)學(xué)表達(dá)式的字符隶校。
這些字符至少符合下列一個(gè)條件:
1.字符帶有已被解析的方向是R
2.字符帶有已被解析的方向是L,它的雙向類型是R或AL蛹锰。
條款HL1和HL3是專業(yè)的應(yīng)用深胳,條款HL4和HL5更常規(guī)。它們?cè)谶@里明確規(guī)定是因?yàn)樗鼈冎苯訉?duì)應(yīng)著常用操作铜犬。
對(duì)HL4應(yīng)用的一個(gè)例子舞终,假設(shè)一個(gè)XML文檔包含以下片段。(注意癣猾,這是一個(gè)簡(jiǎn)化的例子:元素名敛劝,屬性名和屬性值都可能參與進(jìn)來(lái)。)<pre>ARABICenglishARABIC<e1 type='ab'>ARABICenglish<e2 type='cd'>english</pre>這可以被分析為五個(gè)不同的片段:<ol><li>ARABICenglishARABIC</li><li><e1 type='ab'></li><li>ARABICenglish</li><li><e2 type='cd'></li><li>english</li></ol>為了使作為源文本的XML文件可讀纷宇,在編輯器中顯示可以命令這些元素都在統(tǒng)一方向(例如夸盟,所有都是left-to-right)和分別對(duì)每部分應(yīng)用雙向算法。它也可以選擇去命定元素名呐粘,屬性名和屬性值在同一方向上統(tǒng)一(例如满俗,所有都是left-to-right)转捕。對(duì)最終的顯示作岖,標(biāo)記可以被忽略,允許所有的文本(片段a五芝,c和e)一起進(jìn)行重排序痘儡。
4.4 雙向一致性測(cè)試
Unicode字符數(shù)據(jù)庫(kù)[UCD]包含兩個(gè)文件來(lái)為雙向算法[Tests9]的實(shí)現(xiàn)提供一致性測(cè)試。其中一個(gè)文件枢步,BidiTest.txt沉删,
包含了雙向類型詳細(xì)的測(cè)試序列直到一個(gè)給定的長(zhǎng)度,一般是4醉途。另一個(gè)文件矾瑰,BidiCharacterTest.txt,包含顯式代碼點(diǎn)的測(cè)試序列隘擎,包括例如:括號(hào)對(duì)殴穴。每個(gè)測(cè)試文件的格式在該文件的頭部均被說(shuō)明。
5 實(shí)現(xiàn)注意事項(xiàng)
5.1 參考代碼
可獲得用Java編寫雙向算法的參考實(shí)現(xiàn)货葬。源代碼可以從[Code9]下載采幌。鼓勵(lì)實(shí)施者使用這一資源來(lái)測(cè)試它們的實(shí)現(xiàn)≌鹜埃可在[Demo9]找到顯示雙向算法的結(jié)果以及嵌入等級(jí)和調(diào)用每個(gè)字符的規(guī)則的在線演示休傍。
參考代碼被設(shè)計(jì)成遵循該算法的步驟,而沒(méi)有應(yīng)用任何優(yōu)化蹲姐。一個(gè)有效優(yōu)化的例子是僅當(dāng)right-to-left字符存在時(shí)磨取,首先測(cè)試它們并調(diào)用雙向算法人柿。另一個(gè)優(yōu)化是對(duì)匹配括號(hào)對(duì)。雙向括號(hào)對(duì)(字符的Bidi_Paired_Bracket_Type屬性值Open或Close)構(gòu)成雙向類型為ON的字符的一個(gè)子集忙厌。相反顷扩,雙向類型非ON的字符的Bidi_Paired_Bracket_Type屬性為None。因此慰毅, 被 通過(guò)限制對(duì)雙向類型為ON的字符處理隘截,可以優(yōu)化查找Bidi_Paired_Bracket_Type屬性值來(lái)識(shí)別括號(hào)對(duì)的過(guò)程。
5.2 保留BN和顯式格式化字符
一些實(shí)現(xiàn)可能希望在算法運(yùn)行時(shí)汹胃,能保留顯式定向嵌入婶芭、重寫格式字符和BN。事實(shí)上着饥,保留這些格式化字符和BN對(duì)用戶是很重要的犀农。例如有些用戶需要顯示隱藏字符的圖示,因此為了顯示而需要獲取格式化字符和BN宰掉。
以下描述如何通過(guò)算法的步驟來(lái)保留這些字符的具體實(shí)現(xiàn)呵哨。注意,本描述是信息的實(shí)施指南轨奄;它應(yīng)該提供與上述顯式算法一樣的結(jié)果孟害,但萬(wàn)一與顯式算法存在偏差,顯式算法對(duì)于一致性來(lái)說(shuō)更規(guī)范挪拟。
在規(guī)則X2-X5挨务,給雙向狀態(tài)棧中最后一個(gè)條目的嵌入等級(jí),插入一個(gè)初始步驟來(lái)設(shè)置顯式嵌入或重寫字符的嵌入等級(jí)玉组。這適用于RLE谎柄,LRE,RLO和LRO惯雳。
在規(guī)則X6朝巫,移除BN字符外的字符。換句話說(shuō)石景,對(duì)除了B劈猿,RLE,LRE鸵钝,RLO糙臼,LRO,PDF恩商,RLI变逃,LRI,F(xiàn)SI和PDI的所有類型應(yīng)用規(guī)則怠堪。
在規(guī)則X7揽乱,在所有情況下名眉,添加最后一步來(lái)將PDF的嵌入等級(jí)設(shè)置成定向狀態(tài)棧中最后一個(gè)條目的嵌入等級(jí)。
在規(guī)則X9凰棉,不移除所有字符损拢,但將所有RLE,LRE撒犀,RLO福压,LRO和PDF字符轉(zhuǎn)換成BN。
在規(guī)則X10或舞,在確定隔離運(yùn)行序列的sos和eos過(guò)程中荆姆,當(dāng)尋找隔離運(yùn)行序列的首字符前的字符和末字符后的字符時(shí),跳過(guò)任何BN映凳。
在規(guī)則W1胆筒,從每個(gè)NSM開(kāi)始反向搜索直到找到隔離運(yùn)行序列中首個(gè)雙向類型為非BN的字符,如果NSM是一個(gè)隔離啟動(dòng)器或PDI并將NSM設(shè)置成ON诈豌,否則不變仆救。如果NSM是第一個(gè)非BN字符,NSM的類型轉(zhuǎn)換為sos矫渔。
在規(guī)則W4彤蔽,掃描越過(guò)鄰近是ES或CS的BN類型。
在規(guī)則W5蚌斩,轉(zhuǎn)換所有適當(dāng)?shù)腅T和BN序列铆惑,而不只是ET。
在規(guī)則W6送膳,同樣將所有鄰近ET,ES或CS的BN類型轉(zhuǎn)換成ON丑蛤。
在規(guī)則W7叠聋,掃描越過(guò)BN。
在規(guī)則N0-N2受裹,將鄰近中性字符的BN字符看作與中性字符一樣碌补。
在規(guī)則I1和I2,忽略BN棉饶。
在規(guī)則L1厦章,在序列中,包括嵌入和重寫格式化字符和BN連同空格字符和隔離格式化字符照藻,它們的等級(jí)在分隔符或換行符之前被重置袜啃。如果LRE,RLE幸缕,LRO群发,RLO晰韵,PDF或BN的前一個(gè)字符等級(jí)是1,則將它們的等級(jí)解析為1熟妓,否則解析為基礎(chǔ)等級(jí)雪猪。
6 用法
6.1 結(jié)合
正如X9中描述的,零寬度連接符和非連接符影響鄰近(指在原始儲(chǔ)存?zhèn)浞荩╞acking-store)中的鄰近順序起愈,即使這些字符經(jīng)過(guò)雙向算法重新排列后最終變得不鄰近)字符的成型只恨。為了確定特定字符在應(yīng)用雙向算法后的連接行為,這里有兩種主要的策略:
在成型時(shí)抬虽,實(shí)現(xiàn)可以回查儲(chǔ)存?zhèn)浞堇ご危词欠裼邢噜彽腪WNJ或ZWJ字符。
另外斥赋,實(shí)現(xiàn)可以通過(guò)一個(gè)與相鄰字符關(guān)聯(lián)的帶外(out-of-band)字符屬性代替ZWJ和ZWNJ缰猴,這樣信息不會(huì)與雙向算法和保存在字符重新排列的信息相沖突。只要雙向算法被應(yīng)用疤剑,帶外信息可以用于適當(dāng)?shù)某尚汀?br> 6.2 豎排文本
在垂直方向上滑绒,雙向算法仍然用于確定文本的等級(jí)。然而隘膘,這些等級(jí)不是用來(lái)對(duì)文本重排序疑故,因?yàn)樽址ǔJ墙y(tǒng)一地由上至下。相反弯菊,等級(jí)是用于確定文本的旋轉(zhuǎn)纵势。有時(shí)垂直線遵循的垂直基線,基線上每個(gè)字符方向確定且正常(非旋轉(zhuǎn))管钳,字符排列從上到下钦铁,無(wú)論是希伯來(lái)語(yǔ),數(shù)字或拉丁語(yǔ)才漆。當(dāng)在垂直線上牛曹,將文本設(shè)置成阿拉伯語(yǔ)時(shí),更普遍的是使水平線逆時(shí)針旋轉(zhuǎn)90°醇滥,那么字符就從上到下排列黎比。拉丁文字和拉丁數(shù)字可能順時(shí)針旋轉(zhuǎn)90°,那么字符也從上到下排列鸳玩。
雙向算法也可以用于字符從下往上排列阅虫。例如,混合了阿拉伯語(yǔ)和拉丁符號(hào)不跟,此時(shí)所有圖像字符順時(shí)針旋轉(zhuǎn)90°颓帝。Unicode標(biāo)準(zhǔn)不會(huì)指定文本是否水平的或垂直的,或是旋轉(zhuǎn)的。那是留給更高級(jí)別的協(xié)議躲履。
6.3 格式化
由于隱式字符類型和對(duì)解析中性和數(shù)字的啟發(fā)式定向行為见间,隱式雙向排序一般會(huì)在沒(méi)有進(jìn)一步工作就可以產(chǎn)生正確的顯示。但是工猜,當(dāng)一個(gè)right-to-left分段首字符是left-to-right時(shí)米诉,或有不同方向文本的嵌套片段,或是弱字符在定向的邊界時(shí)篷帅,就可能會(huì)出現(xiàn)問(wèn)題史侣。在這些情況下,為得到正確的顯示魏身,可能需要嵌入或定向標(biāo)記惊橱。部分?jǐn)?shù)字可能還需要定向重寫。
最常見(jiàn)的問(wèn)題是中性字符在嵌入式語(yǔ)言的邊界箭昵。這可以通過(guò)正確設(shè)置嵌入式文本的等級(jí)來(lái)解決税朴。例如:以下所有的文本在等級(jí)0中:
<pre>Memory: he said "I NEED WATER!", and expired.
Display: he said "RETAW DEEN I!", and expired.</pre>
如果感嘆號(hào)是阿拉伯語(yǔ)括號(hào)的一部分,那么用戶可以選擇文本I NEED WATER!并明確將它標(biāo)記為嵌入式阿拉伯語(yǔ)家制,并產(chǎn)生以下結(jié)果:<pre>Memory: he said "RLII NEED WATER!PDI", and expired.
Display: he said "!RETAW DEEN I", and expired.</pre>
然而正林,一個(gè)更簡(jiǎn)單和更好的方法是在感嘆號(hào)后面放置一個(gè)RLM。因?yàn)檫@樣感嘆號(hào)標(biāo)記不是在定向邊界颤殴,這會(huì)產(chǎn)生正確的結(jié)果觅廓。當(dāng)人為地編輯文本或程序化生成需要編輯的文本,或處理根本不支持顯式格式化字符的應(yīng)用程序涵但,這是最好的方法杈绸。
<pre>Memory: he said "I NEED WATER!RLM", and expired.
Display: he said "!RETAW DEEN I", and expired.</pre>
首選后者的方法因?yàn)樗皇褂蔑@式格式化字符,在不完全支持編輯器和其他字符處理的情況下矮瘟,它可以輕松擺脫同步瞳脓。然而,顯式格式化字符是絕對(duì)必要的芥永,當(dāng)一個(gè)文本包含與之相反方向的文本篡殷,相反方向的文本包含著與原始方向相同的文本。這種情況并不像人們想象的那樣罕見(jiàn)埋涧,因?yàn)槔≌Z(yǔ)的品牌名稱、技術(shù)術(shù)語(yǔ)和縮寫常書寫在非拉丁語(yǔ)文本的原始拉丁語(yǔ)字符中奇瘦,包括right-to-left文本,如下所示:
<pre>Memory: it is called "RLIAN INTRODUCTION TO javaPDI" - $19.95 in hardcover.
Display: it is called "java OT NOITCUDORTNI NA" - $19.95 in hardcover.</pre>
因此,當(dāng)文本通過(guò)插入數(shù)據(jù)到模板中而程序化生成旅急,不打算以后手動(dòng)編輯胜嗓,而且特定的插入恰好是與模板文本方向相反,這種情況使用顯式格式化字符(或等同它們的標(biāo)記)包裹插入的數(shù)據(jù)是最簡(jiǎn)單的,而不用分析是否真的有必要這樣做或可以使用無(wú)狀態(tài)定向標(biāo)記完成呼猪。
此外画畅,在這種常見(jiàn)的情景中,強(qiáng)烈建議使用定向隔離格式化字符而不是定向嵌入格式化字符(一旦知道目標(biāo)展示平臺(tái)支持隔離)宋距。這是因?yàn)榍度霑?huì)像強(qiáng)字符一樣影響周圍文本轴踱。嵌入的強(qiáng)影響會(huì)產(chǎn)生不可預(yù)料效果,強(qiáng)影響很少產(chǎn)生有益的效果谚赎。為了證明淫僻,這里使用嵌入代替隔離:
<pre>Memory: it is called "RLEAN INTRODUCTION TO javaPDF" - $19.95 in hardcover.
Display: it is called "$19.95 - "java OT NOITCUDORTNI NA in hardcover.</pre>
這當(dāng)然不是預(yù)期中的顯示,這是因?yàn)閿?shù)字(連同里面所有的中性字符)“粘(sticking)”在前面的RTL嵌入上壶唤,就表現(xiàn)得“粘”上了前面的RTL字符了雳灵。
定向隔離也提供了一個(gè)解決方案,在普通情況下闸盔,程序化插入的文本方向是不知道的悯辙。與分析插入文本的字符并決定是否使用LRE或RLE(或LRI或RLI或什么都不使用)不同的是,軟件可以采取簡(jiǎn)單的方式迎吵,即使用FSI和PDI包裹插每個(gè)未知方向躲撰。因此,F(xiàn)SI而不是RLI在上述例子中會(huì)產(chǎn)生相同的顯式钓觉。FSI的第一個(gè)強(qiáng)啟發(fā)式并不是可靠的茴肥,但它能在大多數(shù)情況下甚至在混個(gè)文本中起作用。
雖然用隔離包裹插入是一種有用的計(jì)數(shù)荡灾,但更好的方式是瓤狐,在已知內(nèi)部沒(méi)有被隔離包裹的反方向字符的文本時(shí),不包裹文本批幌。不必要的包裹層次不單增大體積和復(fù)雜度础锐;它們還可能最終超過(guò)了深度限制和渲染無(wú)效的內(nèi)部隔離,這會(huì)導(dǎo)致文本錯(cuò)誤顯示荧缘。一個(gè)普遍的情況是皆警,不需要包裹的插入是一個(gè)已知的本地化的上下文環(huán)境,即一個(gè)帶著插入值的轉(zhuǎn)換消息要不本地化截粗,要不包裹在隔離中信姓。
6.4 分離標(biāo)點(diǎn)符號(hào)
一個(gè)常見(jiàn)的問(wèn)題是其中文本確實(shí)表示著一系列具有分隔標(biāo)點(diǎn)符號(hào)的片段,并且通常是串聯(lián)的绸罗。這些分隔符通常是中性字符的字符串意推。例如,一個(gè)網(wǎng)頁(yè)的底部可能如下:
<pre>advertising programs - business solutions - privacy policy - help - about</pre>
例如珊蟀,這可能通過(guò)分隔符“-”來(lái)連接數(shù)量不定的字符串建立在服務(wù)器上菊值。如果所有的文本轉(zhuǎn)換成阿拉伯語(yǔ)或希伯來(lái)語(yǔ),整體的頁(yè)面方向設(shè)置成RTL,正確的顯示結(jié)果如下:
<pre>TUOBA - PLEH - YCILOP YCAVIRP - SNOITULOS SSENISUB - SMARGORP GNISITREVDA</pre>
然而腻窒,假定在轉(zhuǎn)換中昵宇,保留一些LTR字符。這種情況對(duì)公司名儿子、產(chǎn)品名瓦哎、技術(shù)術(shù)語(yǔ)等來(lái)說(shuō)很常見(jiàn)。如果其中一個(gè)分隔符兩邊是LTR字符典徊,那么會(huì)導(dǎo)致頁(yè)面產(chǎn)生嚴(yán)重的混亂杭煎。例如,假如“programs”和“business”以英語(yǔ)術(shù)語(yǔ)留下而不轉(zhuǎn)換卒落。結(jié)果如下:
<pre>TUOBA - PLEH - YCILOP YCAVIRP - SNOITULOS programs - business GNISITREVDA</pre>
顯而易見(jiàn)羡铲,第一個(gè)術(shù)語(yǔ)“advertising business”和第二個(gè)“programs solutions”就產(chǎn)生了混亂。對(duì)這個(gè)問(wèn)題最簡(jiǎn)單的解決方式是在每個(gè)分隔符字符串中包含一個(gè)RLM字符儡毕。這將導(dǎo)致各分隔符采用right-to-left的方向也切,并產(chǎn)生正確的展示:
<pre>TUOBA - PLEH - YCILOP YCAVIRP - SNOITULOS business - programs GNISITREVDA</pre>
顯式格式化字符(LRE,RLE腰湾,和PDF或LRI雷恃,RLI,F(xiàn)SI和PDI)可以用于取得相同的效果费坊;網(wǎng)頁(yè)會(huì)使用帶有屬性dir="ltr"dir="rtl"span標(biāo)簽倒槐。嵌入到每個(gè)單獨(dú)字段中,不包括分隔符附井√衷剑總的來(lái)說(shuō),首選的顯式格式化字符LRM和RLM永毅,因?yàn)樗鼈兊挠绊懛秶镜鼗芽纾?dāng)文本被復(fù)制時(shí)比使用dir屬性更穩(wěn)健(理論上程序在將文字轉(zhuǎn)換成純文本時(shí)沼死,會(huì)將dir屬性轉(zhuǎn)變成相應(yīng)的顯式格式化字符着逐,但通常并不支持這個(gè)功能)。
6.5 轉(zhuǎn)換為純文本
為了外觀一致意蛀,當(dāng)雙向文本受制于高級(jí)協(xié)議來(lái)轉(zhuǎn)換成Unicode純文本時(shí)耸别,應(yīng)該插入格式化字符來(lái)確保展示順序,展示順序由Unicode雙向算法應(yīng)用程序匹配县钥,通過(guò)高級(jí)協(xié)議指定太雨。每當(dāng)文本使用高級(jí)協(xié)議來(lái)轉(zhuǎn)換成標(biāo)記(marked-up)文本時(shí)that is unaware of the higher-level protocol.,應(yīng)該遵守同樣的原則魁蒜。例如,如果高級(jí)協(xié)議基于L比R/AL字符的數(shù)量來(lái)設(shè)置分段方向?yàn)?(R),當(dāng)轉(zhuǎn)換為純文本兜看,文本里的分段會(huì)被嵌入到括號(hào)對(duì)RLE..PDF格式化字符中锥咸。如果同一文本轉(zhuǎn)換成HTML4.0,屬性dir="rtl"會(huì)被添加到分段元素细移。
7 鏡像
鏡像屬性對(duì)確保正確的字符用于所需的語(yǔ)義來(lái)說(shuō)搏予,非常重要。這是特別重要弧轧,當(dāng)字符的名字與所需的語(yǔ)義不符時(shí)雪侥,如U+0028“(”左括號(hào)(LEFT PARENTHESIS)。雖然字符的名字表明它是個(gè)左括號(hào)精绎,字符確實(shí)表現(xiàn)出開(kāi)括號(hào)(在括號(hào)短語(yǔ)開(kāi)頭的字符速缨,而不是尾隨的那個(gè)。)
某些沒(méi)有Bidi_Mirrored屬性的字符在被渲染成鏡像圖像字符代乃,是由高級(jí)協(xié)議添加鏡像:參閱章節(jié)4.3旬牲,Higher-Level Protocols,尤其是HL6搁吓。除了這種情況原茅,鏡像必須根據(jù)規(guī)則L4,去確保正確的字符被用于表達(dá)所需的語(yǔ)義堕仔,并避免互相干擾和安全問(wèn)題擂橘。
實(shí)行規(guī)則L4需要鏡像圖像字符。這些圖像字符可能不會(huì)是精確的圖形鏡像摩骨。例如通贞,一個(gè)斜體圓括號(hào)不是另一個(gè)的鏡像(“(”不是“)”的圖形鏡像)。Instead, mirror glyphs are those acceptable as mirrors within the normal parameters of the font in which they are represented.
在實(shí)現(xiàn)中仿吞,有時(shí)候字符對(duì)是互相接受的鏡像滑频,例如,U+0028“(” 左括號(hào)(LEFT PARENTHESIS)和U+0029“)”右括號(hào)(RIGHT PARENTHESIS)或U+22E0 “?”不領(lǐng)先與或等于(DOES NOT PRECEDE OR EQUAL)和and U+22E1 “?”不繼承或等于(DOES NOT SUCCEED OR EQUAL)唤冈。其他字符例如U+2231 “?”順時(shí)針?lè)e分(CLOCKWISE INTEGRAL)沒(méi)有相應(yīng)的可接受的鏡像字符峡迷。文件BidiMirroring.txt data file[Data9],列出互為鏡像字形的字符對(duì)。這一數(shù)據(jù)在[UCD]正式的屬性名是Bidi_Mirroring_Glyph你虹。文件中的注釋指出鏡像對(duì)“合適的才是最好的”:雖然理論的鏡像字形的形狀不同绘搞,但在渲染中它們也是可以接受的。
遷移問(wèn)題
在UBA的Unicode 6.3版本有兩個(gè)主要的新增功能:
定向隔離
括號(hào)對(duì)
新的定向隔離的實(shí)現(xiàn)應(yīng)該存在很少的兼容問(wèn)題傅物;UBA經(jīng)過(guò)謹(jǐn)慎的修改以求縮小與以前的文本的差異夯辖。等級(jí)數(shù)量的限制可能會(huì)有些不同,但這在實(shí)際中很少碰到董饰。
對(duì)于括號(hào)對(duì)蒿褂,可能會(huì)有更多不同圆米。在不知道(沒(méi)有良好的用戶界面)定向標(biāo)記或嵌入的情況下,人們構(gòu)建的文本雖然有正確的視覺(jué)呈現(xiàn)但內(nèi)部結(jié)構(gòu)不正確啄栓。(即...[...[...,表現(xiàn)為...[...]...)娄帖。新算法捕獲這類型的問(wèn)題,因?yàn)檫@樣畸形的括號(hào)序列不會(huì)被匹配昙楚。
然而近速,某些情況如缺少規(guī)則N0的舊實(shí)現(xiàn)會(huì)產(chǎn)生預(yù)期的表現(xiàn),而新實(shí)現(xiàn)不會(huì)堪旧。用戶對(duì)實(shí)現(xiàn)的反饋對(duì)決定添加規(guī)則N0具有積極的影響削葱。
對(duì)于那些未能正確更新到以前的Unicode版本的實(shí)現(xiàn),也存在一些兼容問(wèn)題淳梦,特別對(duì)處理不當(dāng)?shù)男本€“T 1/2”(T是一個(gè)阿拉伯字符)表現(xiàn)出錯(cuò)誤的“2/1 T”析砸。
為了減輕兼容問(wèn)題的影響,強(qiáng)烈建議實(shí)現(xiàn)采用以下步驟:
在任何括號(hào)的兩邊谭跨,增加適當(dāng)?shù)亩ㄏ蚋袷交址屍淠鼙灰?guī)則N0解析干厚,這樣也能在舊系統(tǒng)正確地表示。也可以在括號(hào)兩邊使用定向標(biāo)記(RLM或LRM)螃宙。為了向前兼容蛮瞄,在舊系統(tǒng)中撰寫的文本應(yīng)該使用語(yǔ)義正確的括號(hào)(必要時(shí)使用定向格式化字符),以確保Unicode的6.3后的系統(tǒng)實(shí)現(xiàn)得到正確的顯示谆扎。
在圍繞數(shù)字+斜線+數(shù)字(如3/2)的序列添加適合的顯式嵌入挂捅。
部分重組
在Unicode 6.3,對(duì)其文本進(jìn)行了重要的重組堂湖。下表顯示了新舊章節(jié)變化闲先。

|Unicode 6.3|Unicode 6.2|
|:--|:--|:--|
|2.4 Explicit Directional Isolates|n/a|
|2.5 Terminating Explicit Directional Isolates|n/a|
|2.6 Implicit Directional Marks|2.4|
|3.3.3 Preparations for Implicit Processing|n/a|
|3.3.4 Resolving Weak Types …3.3.6 Resolving Implicit Levels|3.3.3…3.3.5|
|6.1 Joiners|5.3|
|6.2 Vertical Text|5.4|
|6.3 Formatting|5.5|
|6.4 Separating Punctuation Marks|5.6|
|6.5 Conversion to Plain Text|n/a|
|Migration Issues|5.7|
致謝
Mark Davis created the initial version of this annex and maintains the text. Aharon Lanin and Andrew Glass made substantial additions to Revision 29 (Unicode 6.3.0).
Thanks to the following people for their contributions to the Bidirectional Algorithm or for their feedback on earlier versions of this annex: Ahmed Talaat (???? ????), Alaa Ghoneim (???? ????), Asmus Freytag, Avery Bishop, Ayman Aldahleh (???? ??????), Behdad Esfahbod (????? ??????), Doug Felt, Dwayne Robinson, Eric Mader, Ernest Cline, Gidi Shalom-Bendor (???? ????-?? ???), Gilead Almosnino (???? ?????????), Isai Scheinberg, Israel Gidali (????? ?????), Joe Becker, John McConnell, Jonathan Kew, Jonathan Rosenne (????? ????), Kamal Mansour (???? ?????), Kenneth Whistler, Khaled Sherif (???? ????), Lauren?iu Iancu, Maha Hassan (??? ???), Markus Scherer, Martin Dürst, Mati Allouche (?????? ????), Michel Suignard, Mike Ksar (????? ????), Murray Sargent, Paul Nelson, Peter Constable, Rick McGowan, Robert Steen, Roozbeh Pournader (????? ???????), Steve Atkin, and Thomas Milo (???????? ??????).
參考

修改
以下總結(jié)了本附件先前的修訂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末无蜂,一起剝皮案震驚了整個(gè)濱河市伺糠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌斥季,老刑警劉巖训桶,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異酣倾,居然都是意外死亡舵揭,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門躁锡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)午绳,“玉大人,你說(shuō)我怎么就攤上這事映之±狗伲” “怎么了蜡坊?”我有些...
    開(kāi)封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)耕漱。 經(jīng)常有香客問(wèn)我算色,道長(zhǎng),這世上最難降的妖魔是什么螟够? 我笑而不...
    開(kāi)封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮峡钓,結(jié)果婚禮上妓笙,老公的妹妹穿的比我還像新娘。我一直安慰自己能岩,他們只是感情好寞宫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著拉鹃,像睡著了一般辈赋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上膏燕,一...
    開(kāi)封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天钥屈,我揣著相機(jī)與錄音,去河邊找鬼坝辫。 笑死篷就,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的近忙。 我是一名探鬼主播竭业,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼及舍!你這毒婦竟也來(lái)了未辆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锯玛,失蹤者是張志新(化名)和其女友劉穎咐柜,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體更振,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炕桨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肯腕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片献宫。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖实撒,靈堂內(nèi)的尸體忽然破棺而出姊途,到底是詐尸還是另有隱情涉瘾,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布捷兰,位于F島的核電站立叛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏贡茅。R本人自食惡果不足惜秘蛇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望顶考。 院中可真熱鬧赁还,春花似錦、人聲如沸驹沿。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)渊季。三九已至朋蔫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間却汉,已是汗流浹背驯妄。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留病涨,地道東北人富玷。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像既穆,于是被迫代替她去往敵國(guó)和親赎懦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Unicode?標(biāo)準(zhǔn)附錄#9 UNICODE雙向算法#### 摘要#### 本附件是一份關(guān)于字符定位的規(guī)范幻工,主要描...
    Eriice閱讀 4,758評(píng)論 0 6
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理励两,服務(wù)發(fā)現(xiàn),斷路器囊颅,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)当悔、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,105評(píng)論 4 62
  • 第一次見(jiàn)你踢代,是在夏天盲憎,一個(gè)充沛陽(yáng)光散盡余溫后的傍晚。你和一群男生圍著一個(gè)籃球架忘情地?fù)]灑汗水胳挎,輾轉(zhuǎn)挪移饼疙,長(zhǎng)長(zhǎng)的睫毛...
    把你放在眼睛里眨呀眨閱讀 650評(píng)論 0 0