2012-07-11 17 views
5

W języku Python, mam tekst, który jest zakodowany w Unicode. Ten tekst zawiera spacje nierozdzielające, które chcę przekonwertować na "x". Nieprzerwane spacje są równe chr(160). Mam następujący kod, który działa świetnie, gdy uruchamiam go jako Django przez Eclipse przy użyciu Localhost. Nie są konwertowane żadne błędy ani spacje nierozdzielające.Python: zastępowanie spacji w Unicode

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

Jednakże gdy uruchomię go w żaden inny sposób (wiersz poleceń Python, Django poprzez uruchomieniowego zamiast Eclipse) pojawia się błąd:

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

Chyba ten błąd ma sens, ponieważ próbuje porównać Unicode (my_text) do czegoś, co nie jest Unicode. Moje pytania to:

  1. Jeśli to chr(160) to nie Unicode, co to jest?
  2. Dlaczego to działa, gdy uruchamiam go z Eclipse? Zrozumienie tego pomoże mi ustalić, czy muszę zmienić inne części mojego kodu. Testowałem mój kod z Eclipse.
  3. (najważniejsze) W jaki sposób mogę rozwiązać mój pierwotny problem usuwania nieprzestrzegających spacji? my_text zdecydowanie będzie w standardzie Unicode.

Odpowiedz

11
  1. W Pythonie 2 chr(160) jest ciąg bajtów, który tylko jeden bajt długości ma wartość 160 lub sześciokątną A0. Nie ma to żadnego znaczenia, z wyjątkiem kontekstu określonego kodowania.
  2. Nie jestem zaznajomiony z Eclipse, ale może on sam odtwarzać własne sztuczki kodowania.
  3. Jeśli chcesz, aby znak Unicode NO-BREAK SPACE, tj. Kod 160, byłby to unichr(160).

np

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

Perfect, dzięki. unichr() działa zarówno przez Eclipse, jak i przez Eclipse. Dziwne, że chr() i unichr() dają taki sam wynik podczas uruchamiania z Eclipse. – user984003

+1

Twoja konfiguracja Eclipse może zmienić domyślne kodowanie na UTF8 zamiast ASCII. Nie jest to zalecane, z powodu oczywistych przyczyn kompatybilności. Kod napisany w tej konfiguracji może nie działać w innym miejscu. –

+0

Właściwie ASCII (0x00 do 0x7F) jest kompatybilny z UTF-8, ponieważ pierwsze 128 punktów kodowych UTF-8 jest takie samo jak ASCII. Jednak 0xa0 zdecydowanie nie jest ASCII, stąd błąd podczas używania 'chr' zamiast' unichr' ... – dda