2012-07-11 11 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") 

は、しかし、他の方法(Pythonコマンドライン、代わりのEclipseのrunserver経由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になります。パイソン2、chr(160)

答えて

11
  1. のみバイト値160、又は六角A0を持つ長さ1のバイト列です。特定のエンコーディングのコンテキスト以外では意味がありません。
  2. 私はEclipseに精通していませんが、独自のエンコーディングトリックを再生している可能性があります。
  3. ユニコード文字NO-BREAK SPACE、つまりコードポイント160の場合は、unichr(160)です。

例えば、

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

パーフェクト、感謝します。 unichr()はEclipse経由でもEclipse経由でも動作しません。 chr()とunichr()は、Eclipseから実行すると同じ結果が得られます。 – user984003

+1

Eclipseの設定によって、デフォルトのエンコーディングがASCIIではなくUTF8に変更される場合があります。これは推奨されていません。互換性の理由から明白なはずです。その構成で書かれたコードは他の場所では動作しないかもしれません。 –

+0

実際には、UTF-8の最初の128コードポイントはASCIIと同じなので、ASCII(0x00〜0x7F)はUTF-8と互換性があります。しかし、0xa0は絶対にASCIIではないので、 'unichr'の代わりに' chr'を使っている間のエラーです... – dda

関連する問題