2015-07-22 2 views
5

Wenn ich schreibeFluphenazin lesen als XeF xac x82uphenazine

>>> st = "Piperazine (perphenazine, fluphenazine)" 

>>> st 

'Piperazine (perphenazine, \xef\xac\x82uphenazine)' 

Was geschieht? Warum macht es das für keine fl? Wie vermeide ich das?

Es sieht \ xef \ xac \ x82 ist in der Tat nicht fl. Gibt es eine Möglichkeit, diese Zeichen in fl zu ‚übersetzen‘ (wie der Autor beabsichtigt), ohne nur ohne sie über so etwas wie

unicode(st, errors='ignore').encode('ascii') 

Antwort

8

Dies ist, was eine „Ligatur“ genannt wird.

Beim Drucken wurden die f- und l-Zeichen mit unterschiedlichem Abstand zwischen den normalen Paaren sequentieller Buchstaben gesetzt. In der Tat würden f und l zu einem Zeichen verschmelzen. Andere Ligaturen umfassen "th", "oe" und "st".

Das ist, was Sie in Ihrer Eingabe bekommen - die "fl" Ligatur, UTF-8 codiert. Es ist eine Drei-Byte-Sequenz. Ich würde ein kleines Problem mit Ihrer Behauptung nehmen, dass es "nicht ist, tatsächlich fl" - es ist wirklich, aber Ihre Eingabe ist UTF-8 und nicht ASCII :-). Ich vermute, dass Sie aus einem Word-Dokument oder einem E-Book eingefügt oder etwas, das für die Präsentation statt Datentreue (oder vielleicht, aus dem Inhalt, war es eine LaTeX-generierte PDF?).

Wenn Sie in diesem speziellen Fall behandeln möchten, können Sie diese Bytefolge durch die ASCII-Buchstaben "fl" ersetzen. Wenn Sie alle solche Fälle behandeln möchten, müssen Sie die "UNIDATA" -Datei des Unicode-Konsortiums verwenden: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt. In dieser Datei gibt es eine Spalte für die "Zerlegung" eines Zeichens. Die f-I-Ligatur hat die Kennung "LATIN SMALL LIGATURE FL". Es gibt übrigens ein Python-Modul für diese Datendatei unter https://docs.python.org/2/library/unicodedata.html. Sie wollen die "Zersetzung" Funktion:

>>> import unicodedata 
>>> foo = u"fluphenazine" 
>>> unicodedata.decomposition(foo[0]) 
'<compat> 0066 006C' 

0066 006C ist natürlich, ASCII 'f' und 'l'.

Beachten Sie, dass Sie einen schlechten Tag haben werden, wenn Sie versuchen, UTF-8-Daten in ASCII zu konvertieren. Es gibt nur 127 ASCII-Zeichen und UTF-8 hat Millionen zu Millionen von Codepunkten. Es gibt viele Codepoints in UTF-8, die nicht ohne weiteres als ASCII dargestellt werden können - wer will, dass ein Text mit "<TREBLE CLEF> <SNOWMAN> <AIRPLANE> <YELLOW SMILEY FACE>" endet?