最近文字コードについて調べてたら?なことがあったのでアウトプット。
簡単に言うと、
hoge = '①' # Python 3 なので Unicode
print(hoge.encode('sjis')) # UnicodeEncodeError
print(hoge.encode('sjis_2004')) # b'\x87\x40'
という話。
「①?機種依存文字でしょ?そんなん使うなよ」というのは今は昔の話で、符号化文字の JIS 規格の最新版 (JIS X 0213:2004) では①から㊿までが (連続でありませんが) 規定されており、いわゆる JIS2004 対応フォントであれば問題なく使用することができます。(例:Windows Vista 標準のメイリオ、Mac OS X (10.5 以降) 標準のヒラギノ)
いつも Shift_JIS で出力するときはサボって 'sjis' と書いてたのでエラーが出て面食らってしまいました。
で、結論としては sjis は Shift_JIS のエイリアスであって、Shift_JIS-2004 のエイリアスではないよーというなんていうことのない話でした。参考:6.6. codecs — Codec registry and base classes — Python v3.2.2 documentation
Shift_JIS-2004 は Shift_JIS の上位互換っぽいし (Shift_JIS + 第三、第四水準漢字)、Shift_JIS-2004 のエイリアスとして動いても問題なさそうなんですが、過去のコードが動かなくなるリスクを背負うよりは今後のコードに一手間入れた方が安全ってことなんでしょうか。
※余談
上記のドキュメントには sjis2004 も shift_jis_2004 の Aliases に入ってるのに、実行してみたら LookupError でそんなエンコーディングねーよでした。バグ?
※追記 2012/02/13-6:10
Lib/encodings/aliases.py にエイリアスの一覧があった。sjis2004 の代わりに s_jis_2004 なるものが。
どうやらドキュメントと aliases の差異については 2005 年の段階で既に報告済みみたいだけど、どうみてもプライオリティ高くないし後回しになってる模様。