Pythonでは、utf-8、euc-jp(EUC-JP)、shift_jis(Shift_JIS)などのエンコーディング(文字符号化方式)が使えます。んじゃ、いったい全部でどのくらいのエンコーディングが使えるのか? と疑問に思いました。http://docs.python.org/release/2.5.2/lib/standard-encodings.html とかのドキュメントに列挙はされているのですが、動いている処理系から情報を得たい。
なんやかんや調べて、encodings.aliases.aliases という属性(値は辞書)を見れべよさそうなことがわかりました。
>>> import encodings
>>> encodings.aliases.aliases
ダラダラダラ ...
ダラダラダラ ...
ダラダラダラ ...
>>>
辞書のキーにエンコーディングの別名、値にPythonにおける正式なエンコーディング名が入っています。値のほうを取り出して一意化(重複を除く)すれば、エンコーディング名が列挙できそうです。ちょっと不安なのは、別名がない(正式な名前だけ)のエンコーディングが抜けてしまいそうなことです。あとそれと、「Pythonにおける正式な名前」はIANA登録の正式な名前とは一致しないことがあるので注意してください。
>>> for c in set(encodings.aliases.aliases.values()):
... print c
...
bz2_codec
cp1140
rot_13
ダラダラダラ ...
ダラダラダラ ...
utf_16_be
johab
iso2022_jp_ext
これをワイライナーにしておくと便利かな、と思いました。いや、あんまり便利でもない気もするけど、ともかくやってみる。
import encodings;for c in set(encodings.aliases.aliases.values()): print c
ダメですな、セミコロンの後にfor文は使えない。では、map関数を使って:
import sys;import encodings;map(lambda c:print c, set(encodings.aliases.aliases.values()))
ダメですな、ラムダ式のなかでprint文(Python 2.xでは関数じゃない)は使えない。では、同等な関数にしますか。
import sys;import encodings;map(lambda c:sys.stdout.write(c+'\n'), set(encodings.aliases.aliases.values()))
動きましたよ。が、最後に None, None, None, None, ... とエライ勢いで拒絶されるような表示が出ます。これを抑制するために、Noneをお尻に付けて:
#!/bin/sh python -c "import sys;import encodings;map(lambda c:sys.stdout.write(c+'\n'), set(encodings.aliases.aliases.values()));None"