かなり昔 とある個人会社からの依頼で作成した VBAプログラムがあった。
そこから今でも 1年に何度か、という程度の相談や問い合わせが来るんだが、今回は処理した結果文字が化けるという問題だった。もう最終の修正から1年以上経過して、これまでは問題なかったのに いきなり発生したので大方読み込むデータファイル(CSV)の問題だろうと高をくくって、問題ファイルを送付してもらった。
処理としては顧客から送られてくる CSVファイルを新規シートに読み込んで、ソート・区分けなどをするマクロコードなんだが、電話を受けた時はてっきり文字コードが異なっている CSVファイルが送られてきたのでは?と思った。ところが問題のファイルを見てみると正常処理されるファイルと文字コードも改行コードも区切り文字も""(ダブルクォーテーション囲い)も全く同一なのに、なぜかデータの途中から漢字コードが変化してしまう。
当初このマクロの制作依頼を受けたときは顧客のシステムが Unix系ということで文字コードは Shift_JISだけではなく Unicode も想定して文字コードが自動判別出来るようにと、元になるコードは何処かのWebから拾ってきて利用したものだったので、解読に苦労しつつ現象を追いかけた。
その現象は、元のファイルが Shift_JISでバイナリで開いた場合の 0h800 Byte目が 2Byteコードで、それ以外の回りの2Byteコードとの組み合わせで現象が起きているような感じだ。処理中で文字コードを Shift_JIS"と固定してしまえば現象は起きないが、"Auto" で文字コード判定しようとして Shift_JIS の判定が出来ず ”Auto" のままだと起きる。しかしデータの頭の部分はちゃんと Shift_JISで読み込めているのに、現象が起きる場合は 0h800 Byte目が 特定の 2Byteコードだと その上位Byteの "8x"や"9x"(xは0-Fのヘキサ値)が すべて"3F"になってしまい、それ以降の2Byteコードの上位Byteも全て"3F" に変化してしまう。
0h800 番地の文字コードだけが問題だとかではなく、離れた場所の文字を変化させても現象が起きたり起きなかったりで、掴みどころがない。当然今までずっと問題は起きなかったということで、Shift_JISでもほとんどのファイルでは現象が起きない。
結局 真の原因追求は諦めて、対策としては、処理するCSVファイルの先頭付近の項目名のような文字が固定されている漢字コードで文字コードを判別して"Shift_JIS"の判定を間違えないようにすることで一件落着したが、その後 Webで調べながらテストしたところ、
ここのサンプルなら問題なさそうだと分かった。
要は文字コードを判定したら ADODB.Stream で読み込むのは UTF-8/8nだけで、Shift_JISなどは FileSystemObject の OpenTextFile()メソッドを使って読み込むというもの。他の Web情報では全ての文字コードを ADODB.Stream で処理する方法がサンプルとして掲載されているが、どうやらそれではダメらしい。