your programing

유니 코드 정규화

lovepro 2020. 12. 30. 19:50
반응형

유니 코드 정규화


파이썬에서 유니 코드 문자열을 정규화하여이를 표현하는 데 사용할 수있는 가장 단순한 유니 코드 엔티티 만 이해하도록 표준 방법이 있습니까?

나는, 같은 순서를 번역 무언가 의미 ['LATIN SMALL LETTER A', 'COMBINING ACUTE ACCENT']로를 ['LATIN SMALL LETTER A WITH ACUTE']?

문제가 어디에 있는지 확인하십시오.

>>> import unicodedata
>>> char = "á"
>>> len(char)
1
>>> [ unicodedata.name(c) for c in char ]
['LATIN SMALL LETTER A WITH ACUTE']

그러나 지금:

>>> char = "á"
>>> len(char)
2
>>> [ unicodedata.name(c) for c in char ]
['LATIN SMALL LETTER A', 'COMBINING ACUTE ACCENT']

물론 모든 문자를 반복하고 수동으로 교체하는 등의 작업을 수행 할 수는 있지만 효율적이지 않으며 특수한 경우의 절반을 놓치고 실수를 저지를 것이라고 확신합니다.


unicodedata모듈은 NFC 형식으로 정규화하려는 .normalize()기능을 제공합니다 .

>>> unicodedata.normalize('NFC', u'\u0061\u0301')
u'\xe1'
>>> unicodedata.normalize('NFD', u'\u00e1')
u'a\u0301'

NFC 또는 'Normal Form Composed'는 구성된 문자, NFD를 반환하고 'Normal Form Decomposed'는 분해되고 결합 된 문자를 제공합니다.

추가 NFKC 및 NFKD 양식은 호환성 코드 포인트를 처리합니다. 예를 들어 U + 2160 (로만 숫자 1)은 실제로 U + 0049 (라틴 대문자 I)와 동일하지만 별도로 처리하는 인코딩과 호환되도록 유니 코드 표준에 존재합니다. 문자를 구성하거나 분해하는 것 외에도 NFKC 또는 NFKD 형식을 사용하면 모든 '호환성'문자가 표준 형식으로 바뀝니다.

>>> unicodedata.normalize('NFC', u'\u2167')  # roman numeral VIII
u'\u2167'
>>> unicodedata.normalize('NFKC', u'\u2167') # roman numeral VIII
u'VIII'

구성 및 분해 된 형식이 의사 소통을한다는 보장은 없습니다. 결합 된 문자를 NFC 형식으로 정규화 한 다음 결과를 다시 NFD 형식으로 변환해도 항상 동일한 문자 시퀀스가 ​​생성되는 것은 아닙니다. 유니 코드 표준 은 예외 목록을 유지합니다 . 이 목록의 문자는 구성 가능하지만 여러 가지 이유로 결합 된 형태로 다시 분해 할 수 없습니다. 또한 Composition Exclusion Table 에 대한 설명서를 참조하십시오 .


예, 있습니다 .

unicodedata.normalize(form, unistr)

네 가지 정규화 형식 중 하나를 선택해야 합니다 .

참조 URL : https://stackoverflow.com/questions/16467479/normalizing-unicode

반응형