2009年10月8日木曜日

 

【Python】『UnicodeEncodeError』とUnicode型について【Unicode】

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
これは、(unicode型である)u1と比較するために、(str型である)s1を文字コード'ascii'でデコードしてunicode型にしようとしたのですが、できませんでした、というエラー

以下のコードはUnicode型を宣言するものであって文字コードがUTF-8ではない。

/* Unicode型変換 */
u'テスト'
unicode(s1)
 // システムのデフォルト文字コード(ascii)になる

文字コードを変換するならば次の様にする。

/* str型の変数を文字コードUTF-8に変換 */
s1.encode('utf_8')

UTF-8にする場合は次のように明記する。

/* 文字コードがUTF-8のUnicode型に変換 */
unicode(s1, 'utf_8')

unicode型を使わずに、str型に特定の文字コードのバイト列を格納してプログラムを書くことも可能だが、どの変数にどの文字コード列が格納されているのかを常に意識しなければならない。

/* 文字コードによるバイト列の違いとUnicode型 */
# EUC-JPなソースコードでは
>>> len("あ")
2
# UTF-8なソースコードでは
>>> len("あ")
3
# unicode型なら
>>> len(u"あ")
1

他にも正規表現の扱いや、文字コードの誤認識によるセキュリティなども気をつけなければならない。
Pythonでは国際化されているライブラリやアプリケーション等では、unicode型での入出力を前提にしている。

入力された文字列はなるべく早い段階でunicode型に変換し、その文字列は出力されるぎりぎりまでunicode型で保持するようにこころがけ、上記のような暗黙に変換されるような処理を書かないよう工夫するのがベストだと私は思います。

詳しいことは以下を参考。よくあるはまりどころと解決策が載っている。

参考

PythonのUnicodeEncodeErrorを知る - HDEラボ
UnicodeEncodeErrorが発生した場合は、sitecustomize.pyでデフォルトのエンコーディングを指定する。 - SumiTomohikoの日記
UnicodeとUTF-8の違い - WeekBuildのHACK日記

ラベル: ,


コメント: コメントを投稿

登録 コメントの投稿 [Atom]



この投稿へのリンク:

リンクを作成



<< ホーム

This page is powered by Blogger. Isn't yours?

登録 投稿 [Atom]

Google