字形

Julia 的 Char 型別表示 Unicode 標量值 ,僅在某些情況下對應於人類認為的角色。例如,字元é的一個表示(如簡歷中)實際上是兩個 Unicode 標量值的組合:

julia> collect("é")
2-element Array{Char,1}:
 'e'
 '́'

這些程式碼點的 Unicode 描述是 LATIN SMALL LETTER ECOMBINING 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