2012-07-11 7 views
5

In Python habe ich einen Text, der Unicode-codiert ist. Dieser Text enthält geschützte Leerzeichen, die ich in 'x' umwandeln möchte. Nicht schließende Räume entsprechen chr(160). Ich habe den folgenden Code, der funktioniert, wenn ich es als Django über Eclipse mit Localhost laufen lasse. Es werden keine Fehler und keine fehlerfreien Leerzeichen konvertiert.Python: Ersatz für nicht sperrenden Raum in Unicode

my_text = u"hello" 
my_new_text = my_text.replace(chr(160), "x") 

Jedoch, wenn ich es auf andere Weise (Python-Befehlszeile, Django über runserver statt Eclipse) betreiben ich erhalte eine Fehlermeldung:

'ascii' codec can't decode byte 0xa0 in position 0: ordinal not in range(128) 

Ich denke, der Fehler macht Sinn, weil es versucht, vergleichen Unicode (my_text) zu etwas, das nicht Unicode ist. Meine Fragen sind:

  1. Wenn chr(160) nicht Unicode ist, was ist das?
  2. Wie funktioniert das, wenn ich es von Eclipse aus starte? Wenn ich dies verstehe, würde ich feststellen, ob ich andere Teile meines Codes ändern muss. Ich habe meinen Code von Eclipse getestet.
  3. (am wichtigsten) Wie löse ich mein ursprüngliches Problem des Entfernens der schussfreien Räume? my_text wird definitiv Unicode sein.

Antwort

11
  1. In Python 2, chr(160) ist ein Byte-String der Länge eins, deren einzige Byte hat den Wert 160 oder hex a0. Es hat keine Bedeutung, außer im Kontext einer spezifischen Codierung.
  2. Ich bin nicht vertraut mit Eclipse, aber es kann sein, Encoding-Tricks zu spielen.
  3. Wenn Sie das Unicode-Zeichen NO-BREAK SPACE möchten, also Codepunkt 160, ist das unichr(160).

Z. B.

>>> u"hello\u00a0world".replace(unichr(160), "X") 
u'helloXworld 
+0

Perfect, danke. unichr() funktioniert sowohl über Eclipse als auch nicht über Eclipse. Seltsam, dass chr() und unichr() bei der Ausführung von Eclipse dasselbe Ergebnis liefern. – user984003

+1

Ihre Eclipse-Konfiguration kann die Standardcodierung in UTF8 anstelle von ASCII ändern. Das ist nicht zu empfehlen, für die nun offensichtlichen Kompatibilitätsgründe. In dieser Konfiguration geschriebener Code funktioniert möglicherweise anderswo nicht. –

+0

Tatsächlich ist ASCII (0x00 bis 0x7F) mit UTF-8 kompatibel, da die ersten 128 Codepunkte von UTF-8 mit ASCII übereinstimmen. Allerdings ist 0xa0 definitiv kein ASCII, daher der Fehler bei der Verwendung von 'chr' anstelle von 'unichr' ... – dda