エクセルで、文字化けしたデータを取り扱う必要が発生しました。
「UTF-8のファイルをSJISで開いちゃった」とかではなく、もともと文字化けが含まれている文字列を取り扱います。
「UTF-8のファイルをSJISで開いちゃった」とかではなく、もともと文字化けが含まれている文字列を取り扱います。
これをエクセル内で復元できるように、VBAで処理してみました。
今回のもので復元できる文字列は、よくあるSJIS/UTF-8間の文字化けです。
今回のもので復元できる文字列は、よくある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で読み込みなおします。
そのため、この文字化けを復元するためには、ADO(ActiveX Database Object)の Stream オブジェクトを用いて、SJISで文字列をオブジェクトに書き込み、それをUTF-8で読み込みなおします。
なお、SJIS/UTF-8間の文字化けの仕組みについては、以下の記事がわかりやすいです。
⇒文字化けでよく出てくる漢字の意味を調べて愛でる
⇒文字化けでよく出てくる漢字の意味を調べて愛でる