##添付ファイル名が文字化けする
ごく一部の環境でWindows8のストアアプリのメーラーで日本語名の添付ファイルを受け取ると、%1B%24%42~.ext
や%EF%BF%%BA.ext
の様になってしまうことがありました。文字化けというか、元のファイル名がパーセントエンコーディングされたまま扱われてしまうようです。
正しいファイル名で受信するための根本的な対策はわからなかったのですが、とりあえずファイル名だけは調べたいということでPythonを使ってデコードをしてみました。
##Pythonでデコード
Pythonではurllib.parse.unquote
を用いることでパーセントエンコーディングをデコードすることが出来ます。ということで、次のコードで変換した結果、
import urllib.parse
a = '%1B%24%42%4A%3F%40%2E%1B%28%42%32%37%1B%24%42%47%2F%1B%28%42%2E%70%64%66'
urllib.parse.unquote(a)
結果は\x1b$BJ?@.\x1b(B27\x1b$BG/\x1b(B.pdf
となり読めません。unquoteではデフォルトでencoding='utf-8'
が指定されているのでutf-8で解釈されるのですが、正常にデコード出来ていないようなので異なる文字コードの様です。
##文字コードを調べる
さて、どの文字コードで表現されていたかを知らないと元の文字列に復元することが出来ないので文字コードを調べる必要があります。文字列を見てみると%1B%24%42
や%1B%28%42
といったパターンがあり、これはJISコードで使われるモードを切り替えるコードです。このことから、この文字列はJISコードだろうということが予想できます。
##あらためてPythonでデコード
JISコードはISO-2022-JPとも呼ばれ、(こちらが正式名称っぽい?)Pythonではiso2022-jpという名前で扱われているようです。encodeing='iso2022-jp'
で文字コードを指定してデコードしてみます。
import urllib.parse
s = '%1B%24%42%4A%3F%40%2E%1B%28%42%32%37%1B%24%42%47%2F%1B%28%42%2E%70%64%66'
urllib.parse.unquote(s, encoding='iso2022-jp')
平成27年.pdf
という結果が得られ、無事にファイル名を知ることが出来ました。