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*1UTF-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

今
入力: 

*1:BOM が何なのかを知るには,[http://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%83%9E%E3%83%BC%E3%82%AF:title=Wikipedia]あたりを関連のページと合わせて読んだ方がわかりやすいと思います.