2012-07-11 47 views
5

'daki bölünmeyen alanı değiştir Python'da, Unicode-kodlanmış bir metin var. Bu metin, 'x' değerine dönüştürmek istediğim kesilmeyen boşluklar içeriyor. Kesilmeyen boşluklar chr(160)'a eşittir. Eclipse aracılığıyla Localhost kullanarak Django olarak çalıştırdığımda harika çalışan aşağıdaki kod var. Hiçbir hata ve herhangi bir kırılmayan alan dönüştürülür. karşılaştırmak çalışıyor çünküPython: Unicode

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

sanırım bu hata anlamda yapar: ben o (yerine Eclipse runserver aracılığıyla Python komut satırı, Django) başka bir şekilde çalıştırdığınızda

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

Ancak bir hata alıyorum Unicode olmayan bir şeye Unicode (my_text). Sorularım:

  1. chr(160) Unicode değilse, nedir?
  2. Eclipse'den çalıştırdığımda bu nasıl çalışıyor? Bunu anlamak, kodumun diğer bölümlerini değiştirmem gerekip gerekmediğimi belirlememe yardımcı olur. Kodumu Eclipse'den test ediyorum.
  3. (en önemlisi) Bozulmayan alanları kaldırma konusundaki ilk sorunumu nasıl çözebilirim? my_text kesinlikle Unicode olacak.
  4. Python 2'de

cevap

11
  1. , chr(160) tek bir bayt değeri 160 ya da altıgen a0 sahip tek üyeli bir baytlık şerittir. Belirli bir kodlama bağlamında bunun dışında hiçbir anlamı yoktur.
  2. Eclipse'le aşina değilim, ancak kendi kodlama numaralarını oynuyor olabilir.
  3. Unicode karakteri NO-BREAK SPACE, yani kod noktası 160'ı istiyorsanız, unichr(160). Ör

,

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

Mükemmel, teşekkürler. unichr(), Eclipse aracılığıyla değil Eclipse aracılığıyla çalışır. Eclipse'den çalışırken chr() ve unichr() 'nin aynı sonucu vermesi garip. – user984003

+1

Eclipse yapılandırmanız, ASCII yerine varsayılan kodlamayı UTF8 olarak değiştirebilir. Bu, açık uyumluluk nedenleri için ne yapılması gerektiği için önerilmez. Bu yapılandırmada yazılmış kod başka bir yerde çalışmayabilir. –

+0

Aslında ASCII (0x00 - 0x7F) UTF-8 ile uyumludur, çünkü UTF-8'in ilk 128 kod noktası ASCII ile aynıdır. Ancak, 0xa0 kesinlikle ASCII değil, dolayısıyla 'unichr' yerine 'chr' kullanırken hata ... – dda

İlgili konular