[VBA]文字化けを復元する関数

見出し



エクセルで、文字化けしたデータを取り扱う必要が発生しました。
「UTF-8のファイルをSJISで開いちゃった」とかではなく、もともと文字化けが含まれている文字列を取り扱います。

これをエクセル内で復元できるように、VBAで処理してみました。
今回のもので復元できる文字列は、よくあるSJIS/UTF-8間の文字化けです。

◆UTF-8の文字列をSJISでエンコードした例
元の文字列文字化け
文字化け譁?ュ怜喧縺
もぺもぺ繧ゅ⊆繧ゅ⊆
スター・バタフライ繧ケ繧ソ繝シ繝サ繝舌ち繝輔Λ繧、

なお、"?"が含まれている文字化けは、完全な復元はできません。(上の例の"譁?ュ怜喧縺"など)
元のエンコードの時点で、データが破損しているためです。


これは、次のような関数で処理できます。比較的シンプル。
引数に文字化けした文字列を入れれば、復元した文字列が返ってきます。
Private Function sjis2utf8(garbled As String) As String
     With CreateObject("ADODB.Stream")
         '【SJISでStreamに書き込む。】
         .Open
         .Type = 2 ' adTypeText。規定値だが、念のため指定。
         .Charset = "shift_jis"
         .WriteText garbled
         
         '【StreamからUTF-8で読み込み、関数に返す。】
         .Position = 0 ' 初期位置に戻る。
         .Charset = "UTF-8"
         sjis2utf8 = .ReadText
         .Close
     End With
End Function

今回の文字化けの原因は、UTF-8のデータをSJISでエンコードしたことです。
そのため、この文字化けを復元するためには、ADO(ActiveX Database Object)の Stream オブジェクトを用いて、SJISで文字列をオブジェクトに書き込み、それをUTF-8で読み込みなおします。


なお、SJIS/UTF-8間の文字化けの仕組みについては、以下の記事がわかりやすいです。
文字化けでよく出てくる漢字の意味を調べて愛でる