- ベストアンサー
Pythonの文字コードとファイル操作
- pythonとbeautifulsoupでHPからデータを取得し、特定の文字だけ文字化けする問題について
- HPのcharsetがutf-8であるにもかかわらず、utf8にエンコードすると特定の文字が文字化けする
- エンコードしないとUnicodeEncodeErrorが発生し、データを保存することができない
- みんなの回答 (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で文字化けせずに書かれているのではないでしょうか? ご指摘のとおり保存したファイルは、エンコードしてもしなくてもきちんと書き込まれてます。 勉強になりました。