アップロードされたファイル名の Unicode 正規化

先日まで知らなかったのだが、Unicode では濁点や半濁点の付いた文字、例えば「が」を表すのに二種類の方法があるそうだ。NFC とか NFD とか詳しくはこの辺りを読んでもらうとして、一般的には NFC が使われているのだがMacOS X のファイルシステムでは NFD で正規化された Unicode が使われている

で、時々この違いが問題になる。例えば Web でアップロードされたファイルのファイル名を扱う場合。Struts なんか使っちゃって、FormFile#getFileName() で取得するファイル名は Mac からアップロードされた場合に文字化けしてしまう可能性がある。

そんなときに使うのが、Java 6 から導入された java.text.Normalizer。詳しくは以下のページを参照。Java SE 6 じゃじゃ馬ならし Unicode の正規化

要約すると、

String fileName = Normalizer.normalize(formFile.getFileName(), Normalizer.Form.NFC);

こうしておかないとヤバいかもよってこと。

Last updated on July 30, 2015