字形
Julia 的 Char
型別表示 Unicode 標量值 ,僅在某些情況下對應於人類認為的角色。例如,字元é的一個表示(如簡歷中)實際上是兩個 Unicode 標量值的組合:
julia> collect("é")
2-element Array{Char,1}:
'e'
'́'
這些程式碼點的 Unicode 描述是 LATIN SMALL LETTER E
和 COMBINING ACUTE ACCENT
。它們共同定義了一個人字元,這是 Unicode 術語稱為字形 。更具體地說,Unicode 附件#29 激發了字形叢集的定義,因為:
重要的是要認識到使用者認為的字元 - 語言編寫系統的基本單元 - 可能不僅僅是單個 Unicode 程式碼點。相反,該基本單元可以由多個 Unicode 程式碼點組成。為了避免計算機使用術語字元的歧義,這稱為使用者感知字元。例如,
G
+ acute-accent 是使用者感知的字元:使用者將其視為單個字元,但實際上由兩個 Unicode 程式碼點表示。這些使用者感知的字元由所謂的字素叢集近似,可以通過程式設計方式確定。
Julia 提供了 graphemes
函式來迭代字串中的字形叢集:
julia> for c in graphemes("résumé")
println(c)
end
r
é
s
u
m
é
請注意,如果我們迭代了 Unicode 標量值,那麼列印每個字元在自己的行上的結果會更好:
julia> for c in "résumé"
println(c)
end
r
e
s
u
m
e
通常,在使用使用者感知的字元處理字元時,處理字形叢集比使用 Unicode 標量值更有用。例如,假設我們想要編寫一個函式來計算單個單詞的長度。一個天真的解決方案是使用
julia> wordlength(word) = length(word)
wordlength (generic function with 1 method)
我們注意到,當單詞包含由多個程式碼點組成的字形叢集時,結果是反直覺的:
julia> wordlength("résumé")
8
當我們使用更正確的定義時,使用 graphemes
函式,我們得到預期的結果:
julia> wordlength(word) = length(graphemes(word))
wordlength (generic function with 1 method)
julia> wordlength("résumé")
6