どうにかGarmin IMGファイルで日本語表示できないか、先人たちの情報をもとに、Garmin IMGファイルを解析をしてみました。基本的には、文字コードが関係する部分だけ変更できればよいはず。
大きく分けて、IMGファイルは、ヘッダ部分とSUB FILEと呼ばれる部分に分かれます。ヘッダ部分は言わずもがな、残りのSUB FILEがどこにあるか何があるかを指示しているテーブルです。SUB FILEの中で今回影響があるのは、文字列を格納しているLBL SUB FILE。
この中に格納されている、SJISの文字部分をUTF8に変換してやればよいはずです。
…と簡単に思っていた時もありました。
LBL SUB FILEを解析して、まず文字コードをShift-JISからUTF8に変換し、そのオフセットや長さ、さらにIMGファイルのVFATブロック情報も全部書き換え、これでいけるだろうと試したら、大量の文字化け…のようなものが発生。
今回LBL SUB FILEのLBL1という部分に文字列が格納されているのですが、どうもオフセットとは、その先頭だけでなく、LBL1内部の各文字列のオフセット位置を、さまざまな情報が直接差ししているようです。そのため、文字列のバイト数が変わってしまうと中途半端な変な場所を指すことになり、それが原因で変な文字化けっぽい現象が発生してしまっている模様。
その影響範囲は、LBL SUB FILEだけにとどまらず、NETSUB FILEやRGN SUB FILEにも広がっています。LBL SUB FILEだけかと思って根気よく変換していたら、どんどん解析する範囲が広がってしまいました。
面倒だなーと思いながらも、ひとまずUTF8でPOIデータくらいまでなら正しく表示できるようになりました(一部例外も残る)。他の部分は時間を見ながらちょくちょくやってみます。