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.normalizejest zaimplementowana za pomocą unicode.decompositionfunkcji, 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.translatezamiast tego do czynienia ze znakami interpunkcyjnymi. translateMetoda 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.normalizedo czynienia z tymi postaciami.