半角カナありiso-2022-jpエンコーディング

Pythonで以下のコードを実行すると、UnicodeEncodeErrorになってしまいます。

u'ハンカク'.encode('iso-2022-jp')

厳密には、オリジナルiso-2022-jpの文字セットは、半角カナや一部の記号等、他の日本語エンコーディングの文字セットに存在する文字を含みません。ところが実際は、多くのアプリケーションでSJISEUC-JPとの相互運用を考慮した拡張実装になっています。(MicrosoftがNEC機種依存文字をうんたらかんたら、という昔話はうんざり…いまは、Unicodeのサブセットとして、特定のロケールで使う文字が網羅できているかどうかですよね)

万全を期すなら、使用できない文字をフィルタするべきですが、「とりあえず動く」Pythonicな現実解プログラムを書くための現実解としては、

u'ハンカク'.encode('iso-2022-jp-ext')

とします。これで、他の日本語エンコーディングで入力された任意の文字列を、とりあえずiso-2022-jpとして扱うことができます。ちなみに、すべてのデスクトップ向けWebブラウザと主要なメールクライアントは、この変換結果である「拡張JIS文字セット」を扱うことが可能です。拡張されていてもバイト列は7ビットでASCII互換なので、サーバ側については心配なし。

ただし、「メールでは半角カナと記号禁止」って条件が要件に含まれるかどうかとは別問題ですよ。