3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

添付ファイル名の文字化けをPythonで解読してみる

Posted at

##添付ファイル名が文字化けする
ごく一部の環境でWindows8のストアアプリのメーラーで日本語名の添付ファイルを受け取ると、%1B%24%42~.ext%EF%BF%%BA.extの様になってしまうことがありました。文字化けというか、元のファイル名がパーセントエンコーディングされたまま扱われてしまうようです。
正しいファイル名で受信するための根本的な対策はわからなかったのですが、とりあえずファイル名だけは調べたいということでPythonを使ってデコードをしてみました。

##Pythonでデコード
Pythonではurllib.parse.unquoteを用いることでパーセントエンコーディングをデコードすることが出来ます。ということで、次のコードで変換した結果、

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'で文字コードを指定してデコードしてみます。

unquote
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という結果が得られ、無事にファイル名を知ることが出来ました。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?