W mojej pierwotnej odpowiedzi również zasugerowałem unicodedata.normalize
. Jednak postanowiłem to przetestować i okazuje się, że nie działa w cudzysłowie Unicode. Wykonuje dobrą robotę tłumacząc akcentowane znaki Unicode, więc domyślam się, że unicodedata.normalize
jest zaimplementowana za pomocą unicode.decomposition
funkcji, co prowadzi mnie do przekonania, że prawdopodobnie obsługuje tylko znaki Unicode, które są kombinacją litery i znaku diakrytycznego, ale tak naprawdę nie jestem ekspert od specyfikacji Unicode, więc mógłbym po prostu być pełen gorącego powietrza ...
W każdym razie możesz użyć unicode.translate
zamiast tego do czynienia ze znakami interpunkcyjnymi. translate
Metoda bierze słownika porządkowych Unicode porządkowych Unicode, dzięki czemu można stworzyć mapowanie, które przekłada Unicode tylko interpunkcyjnych ASCII kompatybilny interpunkcji:
'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!"'
W razie potrzeby możesz dodać więcej mapowań interpunkcyjnych, ale nie sądzę, że musisz koniecznie martwić się obsługą każdego pojedynczego znaku interpunkcyjnego Unicode. Jeśli nie trzeba akcentami uchwyt i innych znaków diakrytycznych, nadal można używać unicodedata.normalize
do czynienia z tymi postaciami.