Unicode

Unicodeモジュールは、Unicode文字および文字列を管理するための基本的な機能を提供します。これには、検証、カテゴリの決定、正規化、大文字小文字の変換、グラフェムのセグメンテーションが含まれており、効果的なUnicodeデータの処理を可能にします。

UnicodeModule

Unicode モジュールは、Unicode 文字および文字列を管理するための基本的な機能を提供します。これには、検証、カテゴリの決定、正規化、大文字小文字の変換、グラフェムのセグメンテーションが含まれ、効果的な Unicode データの処理を可能にします。

source
Unicode.julia_chartransformFunction
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 は、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

この関数は Julia 1.8 で導入されました。

source
Unicode.isassignedFunction
Unicode.isassigned(c) -> Bool

与えられた文字または整数が割り当てられたUnicodeコードポイントである場合はtrueを返します。

julia> Unicode.isassigned(101)
true

julia> Unicode.isassigned('\x01')
true
source
Unicode.isequal_normalizedFunction
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
source
Unicode.normalizeFunction
Unicode.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=truenewline2ls=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"
Julia 1.8

chartransform キーワード引数はJulia 1.8が必要です。

source
Unicode.graphemesFunction
graphemes(s::AbstractString) -> GraphemeIterator

sに対する拡張グラフェムに対応する部分文字列のイテレータを返します。これはUnicode UAX #29によって定義されています。(大まかに言えば、これらはユーザーが単一の文字として認識するものであり、複数のコードポイントを含む場合があります。例えば、アクセント記号と組み合わさった文字は単一のグラフェムです。)

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

sm番目から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)関数は部分文字列の終わりまでの文字列の長さ(コードポイントの数)に比例した時間を要します。

Julia 1.9

graphemesm:n引数はJulia 1.9が必要です。

source