Unicode
Unicode
モジュールは、Unicode文字および文字列を管理するための基本的な機能を提供します。これには、検証、カテゴリの決定、正規化、大文字小文字の変換、グラフェムのセグメンテーションが含まれており、効果的なUnicodeデータの処理を可能にします。
Unicode
— ModuleUnicode
モジュールは、Unicode 文字および文字列を管理するための基本的な機能を提供します。これには、検証、カテゴリの決定、正規化、大文字小文字の変換、グラフェムのセグメンテーションが含まれ、効果的な Unicode データの処理を可能にします。
Unicode.julia_chartransform
— FunctionUnicode.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
は、Julia パーサーによって使用される正規化を模倣するために、Unicode.normalize
関数に渡すのに主に便利です:
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
— FunctionUnicode.isassigned(c) -> Bool
与えられた文字または整数が割り当てられたUnicodeコードポイントである場合はtrue
を返します。
例
julia> Unicode.isassigned(101)
true
julia> Unicode.isassigned('\x01')
true
Unicode.isequal_normalized
— Functionisequal_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
— FunctionUnicode.normalize(s::AbstractString; keywords...)
Unicode.normalize(s::AbstractString, normalform::Symbol)
文字列 s
を正規化します。デフォルトでは、Unicodeバージョンの安定性を保証せずに(compat=false
)、標準的な合成(compose=true
)が行われ、可能な限り短い同等の文字列が生成されますが、以前のUnicodeバージョンには存在しない合成文字が導入される可能性があります。
また、Unicode標準の4つの「正規形」のいずれかを指定することもできます:normalform
は :NFC
、:NFD
、:NFKC
、または :NFKD
にすることができます。正規形C(標準的な合成)とD(標準的な分解)は、同じ抽象文字列の異なる視覚的に同一の表現を単一の標準形に変換します。形Cはよりコンパクトです。正規形KCとKDはさらに「互換性のある同等物」を標準化します:それらは抽象的には類似しているが視覚的には異なる文字を単一の標準的な選択肢に変換します(例:連字を個々の文字に展開します)、形KCはよりコンパクトです。
また、Unicode.normalize(s; keywords...)
を呼び出すことで、より細かい制御と追加の変換を得ることができます。ここでは、次のブールキーワードオプションの任意の数(すべて false
にデフォルト設定されているが、compose
は除く)を指定します:
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
— Functiongraphemes(s::AbstractString) -> GraphemeIterator
s
に対する拡張グラフェムに対応する部分文字列のイテレータを返します。これはUnicode UAX #29によって定義されています。(大まかに言えば、これらはユーザーが単一の文字として認識するものであり、複数のコードポイントを含む場合があります。例えば、アクセント記号と組み合わさった文字は単一のグラフェムです。)
graphemes(s::AbstractString, m:n) -> SubString
s
のm
番目からn
番目までのグラフェムからなるSubString
を返します。ここで、2番目の引数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
)で構成されています。なぜなら、グラフェム"é"
は実際には2つのUnicodeコードポイント('e'
の後に合成文字U+0301の急性アクセントが続く)だからです。
グラフェムの境界を見つけるには文字列の内容を反復処理する必要があるため、graphemes(s, m:n)
関数は部分文字列の終わりまでの文字列の長さ(コードポイントの数)に比例した時間を要します。
graphemes
のm:n
引数はJulia 1.9が必要です。