プロが教えるわが家の防犯対策術!

pythonとbeautifulsoupであるHPからデーターを取ってきて、エンコードして表示するプログラムを作っているのですが特定の文字だけ文字化けします。原因は何ですか?
そのHPはcharset=utf-8 となっているのですが、
for link in links:

title=link.get("title")
href=link.get("href")
data=title+"\t"+href
print data
data=data.encode("utf8")
print data
f1.write(data)
>>>
水遊び /goods/category.php?category=47
水遊び /goods/category.php?category=47
子供用 /goods/category.php?category=40
蟄蝉セ帷畑 /goods/category.php?category=40
犬用 /goods/category.php?category=41
迥ャ逕ィ

utf8にエンコードした場合このように特定の文字だけ文字化けします。またdataをutf8にした場合保存できるのですが、エンコードしないとUnicodeEncodeError: 'ascii' codec can't encode characters in position 0-13: ordinal not in range(128)とでて保存できません。いったいどういうことでしょう。分かる方よろしくお願いします。

A 回答 (1件)

まず、Pythonのバージョン、実行環境を明記してください。


前の質問から、Python2系と仮定します。

Python2系では、内部がバイト列の文字列stringと、内部がUnicodeで表現されたUnicode文字列unicodeがあります。

通常、Unicode文字列を出力するときは、その出力装置に合せたencodeを行います。
stringはそのままのバイト列が出力されます。

beautifulsoupについて不案内なので、ちょっと調べたところ、Unicode文字列で扱う、とありました。

encode前の
>子供用

Unicode→print→(自動で画面用のコードにencode)→画面に表示
となり、画面のコードと一致しているはずです。

> 蟄蝉セ帷畑
UTF-8の「子供用」のバイト列を、Shift_JISとして解釈した変換するとこうなりました。
つまり
Unicode→encodeでUTF-8に→そのままのバイト列でprint→画面でShift_JISとして表示(文字化け)
となっているように感じられます。

使用している端末かなんかが、Shift_JISで表示するようになっていませんか?
> 水遊び
が正しく表示されるのは、その端末は、コード自動判定できるようになっている、とかありませんか?

> f1.write(data)
で書かれたf1(ファイルでしょうか?)
はUTF-8で文字化けせずに書かれているのではないでしょうか?

> UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-13: ordinal not in range(128)
これは、f1.writeに対して、codecがasciiになっているため、asciiの範囲外の文字(日本語とか)のencodeができない、というエラーです。
encodeであらかじめstringに変換する(現行のプログラム)とか、codecを設定するとかします。

この回答への補足

回答ありがとうございます。
python2.7.3 実行環境は付属のエディタのIDLEでいいんでしょうか。

>> f1.write(data)
>で書かれたf1(ファイルでしょうか?)
>はUTF-8で文字化けせずに書かれているのではないでしょうか?

ご指摘のとおり保存したファイルは、エンコードしてもしなくてもきちんと書き込まれてます。
勉強になりました。

補足日時:2012/07/28 02:53
    • good
    • 0
この回答へのお礼

遅くなりました。ありがとうございました。

お礼日時:2012/07/31 20:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!