Python (2.x) の文字コードの件(UTF-8エンコーディング端末での標準入出力)
これも通算7-8時間ほど悪戦苦闘しましたが,UTF-8の場合は下記のような感じでいいのではと思います.
出力
http://d.hatena.ne.jp/ziruchi/20090322/p3 にあるように,UTF-8エンコーディングの端末で標準出力する場合,
# -*- coding: utf-8 -*- print "これはUTF8エンコーディングの日本語文字列"
のようにマジックコメントと普通のprint文を併用して構わないようです.("..."の前にuが付いていないところに注意)
また,http://d.hatena.ne.jp/kakurasan/20100329/p1 からの丸コピーですが,対話モードで,
(注意:UTF-8エンコーディングの端末におけるテスト)
>>> '日本語' == u'日本語'.encode('utf-8') == '\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e' True
となるので,冒頭のprint文は
print u"これはUTF8エンコーディングの日本語文字列".encode('utf-8')
と同じとなります.
入力
キーボードタイプでの入力方法は色々ありますが,今僕が使っているのは raw_input() です.
raw_input() の場合,取得した文字列はデコードされず BOM*1 付 UTF-8 文字列となります.
内部処理,実践
Python 内部では文字列は処理する時に BOM 無しのものになっていなければなりません.マジックコメント (# coding: utf-8 ) でエンコーディングを指定して,ソースの文字セットも正しくUTF-8を指定してあるなら,u"日本語" が内部処理用文字列になります.
外部の言語処理プログラムのラッパークラスを使う際は BOM 付のままでよいことがあります.MeCabがそれに該当します.
以上をまとめて次に例示します:
# -*- coding: utf-8 -*- import MeCab mecab = MeCab.Tagger() while True: str = raw_input('入力: ') if len(str)==0: break print "target stc:", str print mecab.parse(str) str2 = str.decode('utf-8') print str2[0].encode('utf-8')
結果
入力: 今日はいい天気だ。 target stc: 今日はいい天気だ。 今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー は 助詞,係助詞,*,*,*,*,は,ハ,ワ いい 形容詞,自立,*,*,形容詞・イイ,基本形,いい,イイ,イイ 天気 名詞,一般,*,*,*,*,天気,テンキ,テンキ だ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ 。 記号,句点,*,*,*,*,。,。,。 EOS 今 入力: