1. ホーム
  2. python

[解決済み] Python インタープリタが文字列操作で非 ASCII 文字を正しく扱うようにするには?

2022-11-27 23:34:30

質問

以下のような文字列があります。

6 918 417 712

この文字列を切り詰める明確な方法は(私がPythonを理解している限り)、単にこの文字列が s という変数に格納することです。

s.replace('Â ', '')

これでうまくいくはずです。しかし、もちろん、非ASCII文字である '\xc2' がエンコードされていないことを訴えます。

私は、異なるエンコーディングをどのように切り替えるか、全く理解できませんでした。

これは本当に上記のコードと同じですが、今は文脈上ではそうなっています。ファイルはメモ帳に UTF-8 として保存され、次のヘッダーがあります。

#!/usr/bin/python2.4
# -*- coding: utf-8 -*-

コードです。

f = urllib.urlopen(url)

soup = BeautifulSoup(f)

s = soup.find('div', {'id':'main_count'})

#making a print 's' here goes well. it shows 6Â 918Â 417Â 712

s.replace('Â ','')

save_main_count(s)

よりも先に進みません。 s.replace ...

どのように解決するのですか?

Python 2 は ascii をソースファイルのデフォルトエンコーディングとして使用します。つまり、リテラルで非アスキーユニコード文字を使用するには、ファイルの先頭で別のエンコーディングを指定する必要があります。Python 3 では utf-8 をソースファイルのデフォルトエンコーディングとして使用するので、これはあまり問題ではありません。

参照してください。 http://docs.python.org/tutorial/interpreter.html#source-code-encoding

utf-8のソースエンコーディングを有効にするには、上の2行のうちの1行に記述します。

# -*- coding: utf-8 -*-

上記はdocsにありますが、こちらも動作します。

# coding: utf-8

追加の考慮事項

  • ソースファイルは、テキストエディタでも正しいエンコーディングで保存する必要があります。

  • Python 2 では、ユニコード・リテラルには u のように、その前に s.replace(u"Â ", u"") しかし、Python 3では、単に引用符を使用します。Python 2では from __future__ import unicode_literals を使って Python 3 の動作を得ることができますが、これは現在のモジュール全体に影響することに注意してください。

  • s.replace(u"Â ", u"") はまた、以下の場合にも失敗します。 s がユニコード文字列でない場合も失敗します。

  • string.replace は新しい文字列を返し、その場では編集しないので、戻り値も確認してください。