Frage

Alle Gedanken auf, warum dies nicht funktioniert? Ich dachte wirklich, ‚ignorieren‘ würde das Richtige tun.

>>> 'add \x93Monitoring\x93 to list '.encode('latin-1','ignore')
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 4: ordinal not in range(128)
War es hilfreich?

Lösung

... es gibt einen Grund, warum sie "Codierungen" genannt werden ...

Ein wenig Präambel: Man denke an Unicode als Norm, oder dem idealen Zustand. Unicode ist nur eine Tabelle von Zeichen. №65 ist lateinisch Hauptstadt A. №937 griechische Hauptstadt Omega ist. dass nur.

Um einen Computer zu speichern und-oder Unicode zu manipulieren, muss es kodieren es in Bytes. Die direkteste Codierung von Unicode ist UCS-4; jedes Zeichen belegt 4 Byte, und alle ~ 1000000 Zeichen zur Verfügung. Die 4 Bytes enthalten, um die Anzahl der Zeichen in den Unicode-Tabellen als 4-Byte-Ganzzahl. Eine weitere sehr nützliche Kodierung ist UTF-8, die jedes Unicode-Zeichen mit einem bis vier Bytes kodieren kann. Aber es gibt auch einige begrenzten Codierungen, wie „latin1“, die eine sehr begrenzte Anzahl von Zeichen, vor allem von westlichen Ländern verwendet. Solche Codierungen verwenden nur ein Byte pro Zeichen.

Grundsätzlich kann Unicode sein codiert mit vielen Codierungen und kodierten Strings kann entschlüsselten in Unicode. Die Sache ist, Unicode kam ziemlich spät, so dass alle von uns, die einen 8-Bit groß geworden mit Zeichensatz gelernt zu spät, dass die ganze Zeit arbeiteten wir mit verschlüsselt Saiten. Die Codierung kann ISO8859-1 oder Fenster CP437 oder CP850, oder, oder, oder, abhängig von unserem System-Standard sein.

Also, wenn in Ihrem Quellcode, können Sie die Zeichenfolge „add‚Monitoring‘zur Liste“ eingeben (und ich denke, Sie die Zeichenfolge „add‚Monitoring‘zur Liste“ wollten, das zweite Zitat beachten), die Sie tatsächlich verwenden eine Zeichenfolge bereits codiert nach Standardcodepage Ihres Systems (durch das \ x93 Byte ich nehme an, Sie Windows-Codepage 1252, „westliche“ verwenden). Wenn Sie sich von der Unicode erhalten möchten, müssen Sie dekodieren die Zeichenfolge aus dem "cp1252" encoding.

Also, was Sie meinten zu tun, war:

"add \x93Monitoring\x94 to list".decode("cp1252", "ignore")

Es ist bedauerlich, dass Python 2.x eine .encode Methode für Strings zu umfasst; dies ist eine Komfortfunktion für „spezielle“ Kodierungen, wie die „zip“ oder „rot13“ oder „base64“ diejenigen, die nichts mit Unicode zu tun haben.

Wie auch immer, alles, was Sie für Ihre Hin-und-Her-Unicode-Konvertierungen erinnern ist:

  • ein Unicode-String wird codiert auf eine Python 2.x Zeichenfolge (eigentlich eine Folge von Bytes)
  • ein Python 2.x String bekommt entschlüsselt in einer Unicode-Zeichenfolge

In beiden Fällen müssen Sie die Codierung angeben , die verwendet wird.

Ich bin mir nicht ganz klar, ich bin müde, aber ich sicher, hoffe ich helfen.

PS Eine humoristische Randnotiz: Mayas nicht Unicode haben; alte Römer, Griechen, haben die alten Ägypter auch nicht. Sie alle hatten ihre eigenen „Codierungen“, und hatten wenig bis gar keinen Respekt für andere Kulturen. All diese Kulturen zerbröckelte zu Staub. Denken Sie darüber nach Menschen! Machen Sie Ihre Anwendungen Unicode-aware, zum Wohle der Menschheit. :)

PS2 Bitte die vorherige Nachricht nicht verderben, indem er „Aber die Chinesen ...“. Wenn Sie geneigt oder verpflichtet fühlen, dies zu tun, aber es verzögern, indem denken, dass die Unicode BMP meist von chinesischen Schriftzeichen ausgefüllt ist, ist ergo Chinese die Grundlage von Unicode. Ich kann empörend Lügen gehen zu erfinden, solange die Menschen Unicode-fähigen Anwendungen zu entwickeln. Cheers!

Andere Tipps

kodieren ist Unicode-Strings verfügbar, aber die Zeichenfolge, die Sie dort haben nicht scheint Unicode (versuchen Sie mit u'add \ x93Monitoring \ x93 zur Liste ‚)

>>> u'add \x93Monitoring\x93 to list '.encode('latin-1','ignore')
'add \x93Monitoring\x93 to list '

Dies scheint zu funktionieren:

'add \x93Monitoring\x93 to list '.decode('latin-1').encode('latin-1')

Probleme mit dem? Ich frage mich, wenn ‚ignore‘, ‚ersetzen‘ und andere solche codieren Fehlerbehandlung kommt in?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top