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


85

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


21
당신은 용감한 전사입니다. 유니 코드는 파이썬의 대적입니다.
David Berger

답변:


89

유니 디코드 는 완전한 솔루션처럼 보입니다. 멋진 따옴표를 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/


3
흠 .. 독일어 움라우트는 ö = oe, ä = ae 등 대신 기본 문자로 변환됩니다.
ThiefMaster 2014 년

4
@ThiefMaster는 모든 언어에서 해당 사항이 사실입니까? 아마도 Unidecode는 가장 낮은 공통 분모로 갈 것입니다.
Mark Ransom

유니 디코드는 언어 독립적 인 솔루션에 가장 확실하게 적용됩니다. 독일 중심 솔루션의 s/ö/oe/경우 나머지를 정리하기 전에 해당 문자를 수동으로 ( 등) 변환 unidecode합니다.
알렉시스

4
반면 실제로, 핀란드어, 예를 들어 ä -> a, ö -> o크게 잘못된 것입니다, 그것은 여전히 바람직하다 aeoe
안티 Haapala

25

내 원래 대답에서 나는 또한 제안했습니다 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해당 문자를 처리 할 수 있습니다.


21

흥미로운 질문입니다.

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.