UTF-8なString(Java)とAndroidとファイル名
3年も放置していたこのブログ。ネタはいくつかあったものの忘れてしまった。
さて、今回はAndroid開発をしている時に起きた不可解な現象とその原因がテーマだ。
Androidアプリにもファイルを作成する機能がある。普通にJavaでFileOutputStreamなどを使ってファイルにデータを書き込んでいく。
で、今回はCSVのようなテキストファイルを読んで、先頭列のデータをファイル名としてファイルを作成し、その中に2列目のデータを書き込んでいくぞ。
ところがどっこい。書き込んだはずのファイルが見つからないという現象が起こった。AndroidStudioのファイルブラウザから見るとそのファイルはあるが、アプリから探すとないと言われる。なぜだ! しかも同じ方法で書き込んで見えるファイルもある。なぜだ!
テスターの方の調査で原因判明。CSVがUTF-8なファイルだったため、1行目の先頭にBOMが入っていた。なので、ファイル名がBOM+目に見えるファイル名で、AndroidStudioのファイルブラウザではそのファイルは存在しているように見える(AAAAAA.xml)。しかしこのファイルは実は[FEFF]AAAAAA.xmlというファイル名だったのだ。Android(とその根っこであるLinux)ではBOMがファイル名として通ってしまうために起こったものだった。JavaのFileInputStreamはBOMを自動でとってくれないためにそのままファイル名として使われていた。
今回はCSVファイルの中身が実際はすべてASCIIの範囲だったのでCSVファイルを作る側のプログラムをUTF-8からShiftJISエンコーディングでファイルを作るように仕様変更して解決した。Java側で読む時にBOMを扱う方法もググればいっぱいでてくるのでそちらはググってもらいたい。