[python] 파이썬의 “이 유니 코드를위한 최고의 ASCII”데이터베이스는 어디에 있습니까?

왼쪽 큰 따옴표, 아포스트로피의 오른쪽 작은 따옴표 등과 같이 유니 코드 구두점을 사용하는 텍스트가 있으며 ASCII로 필요합니다. 파이썬은 명백한 ASCII 대체가있는 이러한 문자의 데이터베이스를 가지고 있으므로 모두 “?”로 바꾸는 것보다 더 잘할 수 있습니다. ?



답변

유니 디코드 는 완전한 솔루션처럼 보입니다. 멋진 따옴표를 ASCII 따옴표로, 악센트가있는 라틴 문자를 악센트가없는 문자로 변환하고 심지어 ASCII 등가물이없는 문자를 처리하기 위해 음역을 시도합니다. 이렇게하면 사용자가 여러?를 볼 필요가 없습니다. 레거시 7 비트 ASCII 시스템을 통해 텍스트를 전달해야 할 때.

>>> from unidecode import unidecode
>>> print unidecode(u"\u5317\u4EB0")
Bei Jing

http://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/


답변

내 원래 대답에서 나는 또한 제안했습니다 unicodedata.normalize. 그러나 나는 그것을 테스트하기로 결정했고 유니 코드 인용 부호와 함께 작동하지 않는 것으로 밝혀졌습니다. 악센트 부호가있는 유니 코드 문자를 잘 번역하므로이 함수를 unicodedata.normalize사용하여 구현 된 것 같습니다.이 unicode.decomposition기능을 사용하면 문자와 분음 부호의 조합 인 유니 코드 문자 만 처리 할 수 ​​있다고 믿게되지만 실제로는 그렇지 않습니다. 유니 코드 사양에 대한 전문가이므로 열기 만 가득 할 수 있습니다.

어떤 경우 든 unicode.translate대신 구두점 문자를 처리 하는 데 사용할 수 있습니다 . 이 translate메서드는 유니 코드 서수 사전을 유니 코드 서수로 가져 오므로 유니 코드 전용 구두점을 ASCII 호환 구두점으로 변환하는 매핑을 만들 수 있습니다.

'Maps left and right single and double quotation marks'
'into ASCII single and double quotation marks'
>>> punctuation = { 0x2018:0x27, 0x2019:0x27, 0x201C:0x22, 0x201D:0x22 }
>>> teststring = u'\u201Chello, world!\u201D'
>>> teststring.translate(punctuation).encode('ascii', 'ignore')
'"hello, world!"'

필요한 경우 더 많은 구두점 매핑을 추가 할 수 있지만 모든 단일 유니 코드 구두점 문자를 처리하는 것에 대해 반드시 걱정할 필요는 없다고 생각합니다. 당신이 경우 않는 핸들 악센트 및 기타 구별 부호 필요, 당신은 여전히 사용할 수있는 unicodedata.normalize해당 문자를 처리 할 수 있습니다.


답변

흥미로운 질문입니다.

Google 은 다음과 같이 unicodedata 모듈 을 사용 하여이 페이지 를 찾을 수 있도록 도와주었습니다 .

import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')


답변

이에 대한 추가 논의는 http://code.activestate.com/recipes/251871/ 에 있습니다 . 여기에는 NFKD 솔루션과 ± => +/- 및 기타 문자가 아닌 문자와 같은 변환 테이블을 수행하는 몇 가지 방법이 있습니다.


답변