왼쪽 큰 따옴표, 아포스트로피의 오른쪽 작은 따옴표 등과 같이 유니 코드 구두점을 사용하는 텍스트가 있으며 ASCII로 필요합니다. 파이썬은 명백한 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/
s/ö/oe/
경우 나머지를 정리하기 전에 해당 문자를 수동으로 ( 등) 변환 unidecode
합니다.
ä -> a
, ö -> o
크게 잘못된 것입니다, 그것은 여전히 바람직하다 ae
와oe
내 원래 대답에서 나는 또한 제안했습니다 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 솔루션과 ± => +/- 및 기타 문자가 아닌 문자와 같은 변환 테이블을 수행하는 몇 가지 방법이 있습니다.