Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
Pythonでの日本語問題解説
[go: Go Back, main page]

Pythonでの日本語問題解説


Pythonで日本語を扱う時の問題と原因と解決方法
8月 2005
1 2 3 4 5 6 7
8 91011121314
15161718192021
22232425262728
293031    
7月
2005
 9月
2005

XML-Image Letterimage

たとえば!

print u'ほげ'

このコードを実行した時、

Traceback (most recent call last):
  File "<stdin>", line 1, in ?
UnicodeError: MS932 encoding error: invalid character \x82

というような例外が発生するか、

ほげ

といったようにちゃんと表示される場合があったり、

または文字化けしてしまうというように

結果が3通りに分かれます。

分かれる要因は3つあります

  • コード記述環境のエンコーディング

  • Pythonに指定するエンコーディング

  • Pythonに指定済みのデフォルトエンコーディング

コード記述環境というのは主にエディタを指します。 インタラクティブモードを利用する場合、インタラクティブモードを動作させているシェルの事になります。 DOS窓ではmbcsというエンコーディングを用いています。

これらの環境が用いているエンコーディングに留意しておく必要があります。

Pythonに指定するエンコーディングとは、 ソースコード先頭ないし2行目に指定できる

# -*- encoding: utf-8 -*-

こういった記述でPythonにソースコードがどんなエンコーディングであるかを指定する事ができます。 これはインタラクティブモードでは使えないようです。

Pythonに指定済みのデフォルトエンコーディングとは、とあるファイルを設置することで、Pythonにデフォルトエンコーディングを指定する事ができます。これは、上記の指定を省略した時にどのエンコーディングを利用するかをPythonに指定する物です。 当然インタラクティブモードの時のエンコーディングもこの指定で決定されます。

その指定方法とは「(Pythonインストールフォルダ)/Lib/site-packages」に「sitecustomize.py」という名前のファイルを作成するのです。

内容は以下の通り

import sys
sys.setdefaultencoding("utf-8")

こういう形でエンコーディングを指定する事ができます。

この指定をしない場合「'ascii'」エンコーディングになっています。

結局何が言いたいのかというと、前述の3要因の結果、Pythonに指定されたエンコーディングと、コード記述環境のエンコーディングが一致した時だけ、「u'ほげ'」といったコード記述が可能になるという事です。

この場合、多くは標準出力が期待するエンコーディングとインタラクティブモードのエンコーディングは一致しているのが普通なので、

print 'ほげ'

でも問題なく表示されます。

それ以外の状況では、

print unicode('ほげ', 'mbcs')

というように毎回指定しなくてはなりません。

2番目のパラメータに1番目の文字列のエンコーディングを指定しなくてはならない。

「1番目の文字列のエンコーディング」は指定した文字列が文字列定数ならば、「コード記述環境のエンコーディング」ということになります。

存在しませんが、コード記述環境が「mbcs」で、標準出力が「utf-16」な環境では、以下のように記述します。

print unicode('ほげ', 'mbcs').encode('utf-16')

「'ほげ'」を「'mbcs'」としてデコードするとユニコード化され、それを「'utf-16'」でエンコードするとutf-16形式の文字列になるというわけです。

note

ユニコードのシェルがあれば、utf-16などにするとWindowsとの親和性はあがるかもしれませんね。

おもなエンコーディング指定を解説します。

'ascii':

8bitキャラクタをそのまま取り扱います。

'mbcs':

Windowsの多バイト文字セット。これはWindowsロケールセッティングにより、日本語環境では「shift-jis」に対応付けられています。

'utf-8':

Web標準になりつつあるユニコードの8bit長サブセット。 7bitキャラクタのみを用いているコード(英語圏コード)と互換性があり、なおかつユニコード文字を利用できる。 mbcsでは、システム設定の唯一の言語にしか対応できないが、ユニコードでは、複数の言語を混在できる点が違う。

以上に挙げた以外にもいろんなエンコーディングがありますが、エンコーディングで悩まないためには、「utf-8」が最も有効である事は上記の特徴からも明らかでしょう。

ただし、ここで推奨する「utf-8」にしてしまうと、utf-8で記述したファイルをDOS窓で実行すると、

コード記述環境でのエンコーディングが「utf-8」で、標準出力が期待するエンコーディングが「mbcs」という状況が生まれます。

print u'ほげ'.encode('mbcs')

って毎回せなあかんの?と思われるかもしれません。

ユニコード文字列であれば、PythonかWindowsAPIかどちらか知りませんが、自動的にロケール設定である「shift-jis」に変換してくれます。

# -*- encoding: utf-8 -*-
print u'ほげ'

というソースコードをDOS窓で実行してもちゃんと「ほげ」がでます。ご安心を。(出ない人はエディタの設定を間違っています。)

最終更新 2005-08-19 13:30:56

© 2005, NoboNobo