Unicode

Unicode 모듈은 유니코드 문자 및 문자열 관리를 위한 필수 기능을 제공합니다. 이 모듈은 유효성 검사, 범주 결정, 정규화, 대소문자 변환 및 그래프 문자 분할을 포함하여 효과적인 유니코드 데이터 처리를 가능하게 합니다.

UnicodeModule

Unicode 모듈은 유니코드 문자 및 문자열 관리를 위한 필수 기능을 제공합니다. 여기에는 유효성 검사, 범주 결정, 정규화, 대소문자 변환 및 그래프 문자 분할이 포함되어 있어 효과적인 유니코드 데이터 처리를 가능하게 합니다.

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

이 함수는 Julia 1.8에서 도입되었습니다.

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

주어진 문자 또는 정수가 할당된 유니코드 코드 포인트인 경우 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가 정규화된 동등한 유니코드 문자열인지 여부를 반환합니다. casefold=true인 경우 대소문자를 무시합니다(유니코드 대소문자 변환 수행); stripmark=true인 경우 발음 기호 및 기타 결합 문자를 제거합니다.

Unicode.normalize와 마찬가지로, chartransform 키워드를 통해 임의의 함수를 전달할 수 있습니다(정수 코드 포인트를 코드 포인트로 매핑하여) 사용자 정의 정규화를 수행할 수 있습니다. 예를 들어 Unicode.julia_chartransform와 같은 함수를 사용할 수 있습니다.

Julia 1.8

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
source
Unicode.normalizeFunction
Unicode.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"
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을 반환합니다. 여기서 두 번째 인수 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번째 코드포인트(Chars)로 구성됩니다. 왜냐하면 그래프 "é"는 실제로 두 개의 유니코드 코드포인트(문자 'e'와 그 뒤에 오는 발음 기호 결합 문자 U+0301)로 이루어져 있기 때문입니다.

그래프 경계를 찾기 위해 문자열 내용을 반복해야 하므로, graphemes(s, m:n) 함수는 서브스트링의 끝 이전에 문자열의 길이(코드포인트 수)에 비례하는 시간이 필요합니다.

Julia 1.9

graphemesm:n 인수는 Julia 1.9가 필요합니다.

```

source