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 中引入。
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)
傳回 s1
和 s2
是否為正規等效的 Unicode 字串。如果 casefold=true
,則忽略大小寫(執行 Unicode 大小寫轉換);如果 stripmark=true
,則移除變音符號和其他組合字元。
與 Unicode.normalize
一樣,您也可以透過 chartransform
關鍵字傳遞任意函式(將 Integer
編碼點對應到編碼點)來執行自訂正規化,例如 Unicode.julia_chartransform
。
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=true
、newline2ls=true
或newline2ps=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"
chartransform
關鍵字引數需要 Julia 1.8。
Unicode.graphemes
— 函數graphemes(s::AbstractString) -> GraphemeIterator
傳回 s
子字串的迭代器,這些子字串對應到字串中的擴充字形,如 Unicode UAX #29 所定義的。(粗略來說,這些是使用者會視為單一字元的字元,即使它們可能包含多個碼位;例如,一個字母結合一個重音符號是一個單一字形。)
graphemes(s::AbstractString, m:n) -> SubString
傳回 s
的 SubString
,包含字串 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)
函數需要時間與子字串結束前字串長度(碼位數)成正比。
graphemes
的 m:n
參數需要 Julia 1.9。