2009-05-03 2 views
79

왼쪽 따옴표, 아포스트로피에 대한 작은 따옴표 등의 유니 코드 구두점을 사용하는 텍스트가 있는데 ASCII로 입력해야합니다. 파이썬에는 확실한 ASCII 대체 문자가있는이 문자들의 데이터베이스가 있습니까? 그래서 모든 것을 "?"로 바꾸는 것보다 더 잘할 수 있습니까? ?파이썬의 "이 유니 코드를위한 최고의 ASCII"데이터베이스는 어디에 있습니까?

+21

당신은 용감한 전사입니다. 유니 코드는 파이썬의 아치 천적입니다. –

+1

이 내용을 찾는 사람들은 [파이썬 유니 코드 문자열에서 악센트를 제거하는 가장 좋은 방법은 무엇입니까?] (http://stackoverflow.com/q/517923/562769) –

답변

84

Unidecode은 완벽한 솔루션처럼 보입니다. 멋진 따옴표를 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

+4

@ThiefMaster는 모든 언어에 해당하는 해당 항목입니까? 어쩌면 유니 코드가 가장 낮은 공통 분모가 될 수도 있습니다. –

+0

Unidecode는 언어 독립적 솔루션으로 가장 확실하게 이동합니다. 독일 중심의 솔루션의 경우, 적용 가능한 charecters를 수동으로 변환 ('s/ö/oe /'등) 한 다음 나머지를'unidecode '로 정리하십시오. – alexis

19

흥미로운 질문입니다. 또한 unicodedata.normalize을 제안, 내 원래의 대답에

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

유용하지만 유니 코드 구두점을 버립니다. . – joeforker

24

을 :

구글은 나에게 다음과 같은 unicodedata module를 사용 descibes하는 this page을 찾을 수있었습니다. 그러나, 나는 그것을 테스트하기로 결정했고 그것은 유니 코드 인용 부호로 작동하지 않는다는 것이 밝혀졌습니다. 그것은 악센트 부호가있는 유니 코드 문자들을 번역하는 것이기 때문에 이 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을 사용할 수 있습니다.

+0

'unidecode' 패키지도 참조하십시오. – joeforker