Unicode
Unicode
모듈은 유니코드 문자 및 문자열 관리를 위한 필수 기능을 제공합니다. 이 모듈은 유효성 검사, 범주 결정, 정규화, 대소문자 변환 및 그래프 문자 분할을 포함하여 효과적인 유니코드 데이터 처리를 가능하게 합니다.
Unicode
— ModuleUnicode
모듈은 유니코드 문자 및 문자열 관리를 위한 필수 기능을 제공합니다. 여기에는 유효성 검사, 범주 결정, 정규화, 대소문자 변환 및 그래프 문자 분할이 포함되어 있어 효과적인 유니코드 데이터 처리를 가능하게 합니다.
Unicode.julia_chartransform
— FunctionUnicode.julia_chartransform(c::Union{Char,Integer})
유니코드 문자(Char
) 또는 코드포인트(Integer
) c
를 줄리아 파서 내에서 사용되는 사용자 정의 동등성에 따라 해당 "동등한" 문자 또는 코드포인트로 매핑합니다(또한 NFC 정규화 포함).
예를 들어, 'µ'
(U+00B5 마이크로)는 줄리아의 파서에 의해 'μ'
(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> 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
주어진 문자 또는 정수가 할당된 유니코드 코드 포인트인 경우 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
가 정규화된 동등한 유니코드 문자열인지 여부를 반환합니다. casefold=true
인 경우 대소문자를 무시합니다(유니코드 대소문자 변환 수행); stripmark=true
인 경우 발음 기호 및 기타 결합 문자를 제거합니다.
Unicode.normalize
와 마찬가지로, chartransform
키워드를 통해 임의의 함수를 전달할 수 있습니다(정수 코드 포인트를 코드 포인트로 매핑하여) 사용자 정의 정규화를 수행할 수 있습니다. 예를 들어 Unicode.julia_chartransform
와 같은 함수를 사용할 수 있습니다.
isequal_normalized
함수는 Julia 1.8에 추가되었습니다.
예제
예를 들어, 문자열 "noël"
은 유니코드에서 두 가지 정규화된 동등한 방법으로 구성될 수 있습니다. 이는 "ë"
가 단일 코드 포인트 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
를 정규화합니다. 기본적으로, 정규화된 조합(compose=true
)이 유니코드 버전 안정성을 보장하지 않고(compat=false
) 수행되며, 이는 가능한 가장 짧은 동등 문자열을 생성하지만 이전 유니코드 버전에는 없는 조합 문자를 도입할 수 있습니다.
대신, 유니코드 표준의 네 가지 "정규형" 중 하나를 지정할 수 있습니다: 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
: 유니코드 대소문자 접기를 수행함, 예: 대소문자 구분 없는 문자열 비교를 위해newline2lf=true
,newline2ls=true
, 또는newline2ps=true
: 다양한 줄 바꿈 시퀀스(LF, CRLF, CR, NEL)를 각각 줄 바꿈(LF), 줄 구분(LS), 또는 단락 구분(PS) 문자로 변환함stripmark=true
: 발음 기호를 제거함(예: 악센트)stripignore=true
: 유니코드의 "기본 무시 가능" 문자를 제거함(예: 소프트 하이픈 또는 왼쪽에서 오른쪽으로의 마커)stripcc=true
: 제어 문자를 제거함; 수평 탭과 폼 피드는 공백으로 변환됨; 줄 바꿈도 줄 바꿈 변환 플래그가 지정되지 않는 한 공백으로 변환됨rejectna=true
: 할당되지 않은 코드 포인트가 발견되면 오류를 발생시킴stable=true
: 유니코드 버전 안정성을 강제함(이전 유니코드 버전에서 누락된 문자를 절대 도입하지 않음)
또한, chartransform
키워드(기본값은 identity
)를 사용하여 Integer
코드 포인트를 코드 포인트로 매핑하는 임의의 함수를 전달할 수 있으며, 이는 s
의 각 문자가 처리될 때 호출되어 임의의 추가 정규화를 수행합니다. 예를 들어, chartransform=Unicode.julia_chartransform
을 전달하면, 식별자를 구문 분석할 때 줄리아가 수행하는 몇 가지 줄리아 특정 문자 정규화를 적용할 수 있습니다(또한 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
을 반환합니다. 여기서 두 번째 인수 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
s)로 구성됩니다. 왜냐하면 그래프 "é"
는 실제로 두 개의 유니코드 코드포인트(문자 'e'
와 그 뒤에 오는 발음 기호 결합 문자 U+0301)로 이루어져 있기 때문입니다.
그래프 경계를 찾기 위해 문자열 내용을 반복해야 하므로, graphemes(s, m:n)
함수는 서브스트링의 끝 이전에 문자열의 길이(코드포인트 수)에 비례하는 시간이 필요합니다.
graphemes
의 m:n
인수는 Julia 1.9가 필요합니다.
```