2016-03-06 42 views
4

一般斯威夫特是真的智能計數字形集羣作爲一個單一的字符。如果我想打一個黎巴嫩國旗,例如,我可以將兩者結合起來的Unicode字符爲什麼斯威夫特將這個字形集羣統計爲兩個字符而不是一個字符?

  • U + 1F1F1區域指標符號字母L
  • U + 1F1E7區域指標符號字母B

並預期這是斯威夫特一個字符:

let s = "\u{1f1f1}\u{1f1e7}" 
assert(s.characters.count == 1) 
assert(s.utf16.count == 4) 
assert(s.utf8.count == 8) 

但是,讓我們說我要讓菲茨帕特里克的Type-5的騎自行車的表情符號。如果我結合

  • U + 1F6B4騎車
  • U + 1F3FE EMOJI MODIFIER FITZPATRICK TYPE-5

斯威夫特計數,這種組合人物!

let s = "\u{1f6b4}\u{1f3fe}" 
assert(s.characters.count == 2) // <----- WHY? 
assert(s.utf16.count == 4) 
assert(s.utf8.count == 8) 

爲什麼這兩個字符而不是一個?

表明爲什麼我希望它是1,注意,這個集羣實際上是解釋爲一個有效的表情符號:答案

enter image description here

+0

這看起來像一個錯誤報告。爲什麼不把它發送給Swift團隊? –

+0

http://unicode.org/reports/tr51/有點含糊:「只要這些字符中的一個緊跟某些字符(例如WOMAN),那麼字體應該將該序列顯示爲單個字形...」 –

+2

在https://bugs.swift.org/browse/SR-375有關於這一點的討論。不幸的是,這並不能說明情況。 – emrys57

回答

7

部分在emrys57的評論中提到的bug report中給出。將一個Unicode字符串拆分爲「字符」時,Swift顯然使用UAX #29 Unicode Text Segmentation中定義的字形集羣邊界。有一個rule not to break between regional indicator symbols,但表情符號修飾符沒有這樣的規則。因此,根據UAX#29,字符串"\u{1f6b4}\u{1f3fe}"包含兩個字素集羣。看到肯惠斯勒this message Unicode的郵件列表上的解釋:

這源於一個事實,即該修飾的後備行爲 僅僅作爲獨立的象形blorts,即顏色樣本圖像。 [...]您需要額外的,具體的 關於這些序列的知識 - 它不只是從 默認落實到字形集羣的UAX#29規則。

相關問題