Androidのアプリ開発をしていて、ちょっとしたトラブルに巻き込まれたので、メモっておきます。
なんでもない、お客さんから頼まれて、ダイアログに表示するメッセージを変更するだけの案件だったのですが、PDFに書かれた文字を、string.xmlにコピペしたところ、日本語が文字化けするようになってしまいました。

文字コードの問題かと思って、string.xmlを別のテキストエディタで開いて確認するも、文字コードや改行コードには問題がありません。あれやこれやと、いろいろな設定を見なおしてみるものの、文字化けが直りません。また、ダイアログに表示するのではなく、LogCatにリソースからメッセージを取り出して表示させるも、問題がありません。LogCatには文字化けせず表示されます。

5分で終わるはずの案件が、1時間以上も悩むことに・・・。

そこで、LogCatの吐き出すログを、ひたすら1つずつチェックしていくと、「TextLayoutCache::replaceThai」という奇妙なメッセージが出力されていることに気づきました。なぜ、タイ語に変換されなくてはならないのか・・・。

その後もしばらく悩むものの、ダイアログに別のメッセージを表示させると、問題なく表示されます。そこで、string.xmlの内容を一度消して、今度は、PDFからコピペするのではなく、一文字ずつ自分で打ち込んでみました。

すると・・・文字化けせず、正しく表示されました。若干、納得がいかないのですが、お客さんからもらったPDFの中にタイ語で使われている制御コードなどが紛れ込んでいて、それで、Androidのダイアログに表示するときにタイ語として表示されたので、文字化けしていたようです。うーむ、運が悪かったとしか言いようのないバグでした。久々に、つまらないことで悩んだので、メモまで。

ここから得られる教訓:

  • 目で見るデータを信頼するな!目に見えない制御コードが埋め込まれている可能性がある、バイナリエディタで見るんだ!
  • AndroidのLogCatを目を皿のようにして調べて、気になるメッセージがあれば、検索してみること。
  • 押してダメなら引いてみよう、引いてダメなら消してやり直してみよう