Unicode

Unicode.julia_chartransform函式
Unicode.julia_chartransform(c::Union{Char,Integer})

將 Unicode 字元 (Char) 或碼位 (Integer) c 對應到對應的「等效」字元或碼位,根據 Julia 剖析器內部使用的自訂等效 (除了 NFC 正規化)。

例如,'µ' (U+00B5 微米) 被 Julia 的剖析器視為等效於 'μ' (U+03BC 謬),因此 julia_chartransform 會執行此轉換,同時讓其他字元保持不變

julia> Unicode.julia_chartransform('µ')
'μ': Unicode U+03BC (category Ll: Letter, lowercase)

julia> Unicode.julia_chartransform('x')
'x': ASCII/Unicode U+0078 (category Ll: Letter, lowercase)

julia_chartransform 主要用於傳遞給 Unicode.normalize 函式,以模擬 Julia 剖析器使用的正規化

julia> s = "µö"
"µö"

julia> s2 = Unicode.normalize(s, compose=true, stable=true, chartransform=Unicode.julia_chartransform)
"μö"

julia> collect(s2)
2-element Vector{Char}:
 'μ': Unicode U+03BC (category Ll: Letter, lowercase)
 'ö': Unicode U+00F6 (category Ll: Letter, lowercase)

julia> s2 == string(Meta.parse(s))
true
Julia 1.8

此函式於 Julia 1.8 中引入。

Unicode.isassigned函式
Unicode.isassigned(c) -> Bool

如果給定的字元或整數是已分配的 Unicode 編碼點,則傳回 true

範例

julia> Unicode.isassigned(101)
true

julia> Unicode.isassigned('\x01')
true
Unicode.isequal_normalized函式
isequal_normalized(s1::AbstractString, s2::AbstractString; casefold=false, stripmark=false, chartransform=identity)

傳回 s1s2 是否為正規等效的 Unicode 字串。如果 casefold=true,則忽略大小寫(執行 Unicode 大小寫轉換);如果 stripmark=true,則移除變音符號和其他組合字元。

Unicode.normalize 一樣,您也可以透過 chartransform 關鍵字傳遞任意函式(將 Integer 編碼點對應到編碼點)來執行自訂正規化,例如 Unicode.julia_chartransform

Julia 1.8

isequal_normalized 函式新增於 Julia 1.8。

範例

例如,字串 "noël" 可以使用兩種正規等效的方式在 Unicode 中建構,這取決於 "ë" 是由單一編碼點 U+00EB 形成,還是由 ASCII 字元 'e' 後接 U+0308 組合變音符號字元形成。

julia> s1 = "noël"
"noël"

julia> s2 = "noël"
"noël"

julia> s1 == s2
false

julia> isequal_normalized(s1, s2)
true

julia> isequal_normalized(s1, "noel", stripmark=true)
true

julia> isequal_normalized(s1, "NOËL", casefold=true)
true
Unicode.normalize函式
Unicode.normalize(s::AbstractString; keywords...)
Unicode.normalize(s::AbstractString, normalform::Symbol)

正規化字串 s。預設情況下,會執行正規組合(compose=true),而不確保 Unicode 版本穩定性(compat=false),這會產生最短的等效字串,但可能會引入較早的 Unicode 版本中不存在的組合字元。

或者,可以指定 Unicode 標準的四種「正規形式」之一:normalform 可以是 :NFC:NFD:NFKC:NFKD。正規形式 C(標準組成)和 D(標準分解)將相同抽象字串的不同視覺相同表示轉換成單一標準形式,其中形式 C 較為緊湊。正規形式 KC 和 KD 另外標準化「相容等效」:它們將抽象上相似但視覺上不同的字元轉換成單一標準選擇(例如,它們將連字展開成個別字元),其中形式 KC 較為緊湊。

或者,可以透過呼叫 Unicode.normalize(s; keywords...) 取得更精細的控制和額外轉換,其中可以指定任何數量的下列布林關鍵字選項(除了 compose 之外,所有選項預設為 false

  • compose=false:不執行標準組成
  • decompose=true:執行標準分解,而非標準組成(如果存在,則忽略 compose=true
  • compat=true:標準化相容等效
  • casefold=true:執行 Unicode 大小寫折疊,例如用於不分大小寫的字串比較
  • newline2lf=truenewline2ls=truenewline2ps=true:分別將各種換行序列(LF、CRLF、CR、NEL)轉換成換行(LF)、行分隔(LS)或段落分隔(PS)字元
  • stripmark=true:移除變音符號(例如重音)
  • stripignore=true:移除 Unicode 的「預設可忽略」字元(例如軟連字號或由左至右標記)
  • stripcc=true:移除控制字元;水平標籤和換頁符號轉換成空格;除非已指定換行轉換標記,否則換行也會轉換成空格
  • rejectna=true:如果找到未指派的碼位,則擲回錯誤
  • stable=true:強制執行 Unicode 版本穩定性(絕不引入早期 Unicode 版本中缺少的字元)

您也可以使用 chartransform 關鍵字(預設為 identity)傳遞一個任意 函數,將 Integer 碼位對應到碼位,它會在處理 s 中的每個字元時呼叫,以執行任意額外的正規化。例如,透過傳遞 chartransform=Unicode.julia_chartransform,您可以套用一些 Julia 特定的字元正規化,這些正規化會在 Julia 解析識別碼時執行(除了 NFC 正規化:compose=true, stable=true)。

例如,NFKC 對應到選項 compose=true, compat=true, stable=true

範例

julia> "é" == Unicode.normalize("é") #LHS: Unicode U+00e9, RHS: U+0065 & U+0301
true

julia> "μ" == Unicode.normalize("µ", compat=true) #LHS: Unicode U+03bc, RHS: Unicode U+00b5
true

julia> Unicode.normalize("JuLiA", casefold=true)
"julia"

julia> Unicode.normalize("JúLiA", stripmark=true)
"JuLiA"
Julia 1.8

chartransform 關鍵字引數需要 Julia 1.8。

Unicode.graphemes函數
graphemes(s::AbstractString) -> GraphemeIterator

傳回 s 子字串的迭代器,這些子字串對應到字串中的擴充字形,如 Unicode UAX #29 所定義的。(粗略來說,這些是使用者會視為單一字元的字元,即使它們可能包含多個碼位;例如,一個字母結合一個重音符號是一個單一字形。)

graphemes(s::AbstractString, m:n) -> SubString

傳回 sSubString,包含字串 s 的第 m 個到第 n 個字形,其中第二個引數 m:n 是整數值 AbstractUnitRange

廣義來說,這對應到字串中第 m 個到第 n 個使用者感知的「字元」。例如

julia> s = graphemes("exposé", 3:6)
"posé"

julia> collect(s)
5-element Vector{Char}:
 'p': ASCII/Unicode U+0070 (category Ll: Letter, lowercase)
 'o': ASCII/Unicode U+006F (category Ll: Letter, lowercase)
 's': ASCII/Unicode U+0073 (category Ll: Letter, lowercase)
 'e': ASCII/Unicode U+0065 (category Ll: Letter, lowercase)
 '́': Unicode U+0301 (category Mn: Mark, nonspacing)

這包含 "exposé" 中的第 3 個到第 7 個碼位(Char),因為字形 "é" 實際上是 兩個 Unicode 碼位(一個 'e' 後面跟著一個 U+0301 的銳音符號組合字元)。

由於尋找字形邊界需要迭代字串內容,因此 graphemes(s, m:n) 函數需要時間與子字串結束前字串長度(碼位數)成正比。

Julia 1.9

graphemesm:n 參數需要 Julia 1.9。