5

Python には、Unicode でエンコードされたテキストがあります。このテキストには、'x' に変換したい非改行スペースが含まれています。非改行スペースは と同じchr(160)です。次のコードがあります。これは、Localhost を使用して Eclipse 経由で Django として実行するとうまく機能します。エラーはなく、非改行スペースは変換されません。

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. Unicode でない場合chr(160)、それは何ですか?
  2. Eclipse から実行すると、なぜこれが機能するのですか? これを理解すると、コードの他の部分を変更する必要があるかどうかを判断するのに役立ちます。私はEclipseから自分のコードをテストしています。
  3. (最も重要) 非改行スペースを削除するという当初の問題を解決するにはどうすればよいですか? my_text間違いなくUnicodeになるでしょう。
4

1 に答える 1

11
  1. Python 2 では、chr(160)長さ 1 のバイト文字列で、そのバイトのみが値 160、つまり 16 進数の a0 を持ちます。特定のエンコーディングのコンテキストを除いて、それに付随する意味はありません。
  2. 私は Eclipse に詳しくありませんが、独自のエンコーディング トリックを実行している可能性があります。
  3. NO-BREAK SPACEUnicode 文字、つまりコード ポイント 160が必要な場合は、unichr(160).

例えば、

>>> u"hello\u00a0world".replace(unichr(160), "X")
u'helloXworld
于 2012-07-11T16:17:16.347 に答える