2012-07-11 202 views
5

在Python中,我有一個Unicode編碼的文本。這個文本包含了不間斷的空格,我想將它轉換爲'x'。非中斷空格等於chr(160)。我有以下代碼,當我使用Localhost通過Eclipse將它作爲Django運行時,它非常適用。沒有錯誤和任何不間斷的空間被轉換。Python:替換Unicode中的不間斷空格

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

然而,當我運行任何其他方式(通過的runserver而不是Eclipse的Python的命令行,Django的)我得到一個錯誤:

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

我想這個錯誤是有道理的,因爲它試圖比較Unicode(my_text)到不是Unicode的東西。我的問題是:

  1. 如果chr(160)不是Unicode,它是什麼?
  2. 當我從Eclipse運行它時,這是如何工作的?理解這將幫助我確定是否需要更改我的代碼的其他部分。我一直在從Eclipse測試我的代碼。
  3. (最重要的是)我如何解決我原來的問題,消除非休息空間? my_text肯定會是Unicode。

回答

11
  1. 在Python 2,chr(160)是長度爲一個,其唯一字節具有值160,或十六進制A0的字節串。除了特定的編碼環境外,沒有任何意義。
  2. 我對Eclipse並不熟悉,但它可能正在播放自己的編碼技巧。
  3. 如果您想要Unicode字符NO-BREAK SPACE,即代碼點160,那就是unichr(160)

例如,

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

完美,謝謝。 unichr()既可以通過Eclipse工作,也可以不通過Eclipse工作。奇怪的是,從Eclipse運行時,chr()和unichr()會給出相同的結果。 – user984003 2012-07-11 16:56:08

+1

您的Eclipse配置可能會將默認編碼更改爲UTF8而不是ASCII。不建議這樣做,因爲現在應該有明顯的兼容性原因。以該配置編寫的代碼可能無法在別處工作。 – 2012-07-11 23:44:24

+0

實際上,ASCII(0x00至0x7F)與UTF-8兼容,因爲UTF-8的前128個碼點與ASCII碼相同。但是,0xa0絕對不是ASCII,因此在使用'chr'而不是'unichr'時出錯。 – dda 2012-07-12 13:14:25