【VBA】文字コード・エンコードと改行コードについて

VBA

VBAに限らず、プログラミング言語でテキストファイル(csvを含む)を扱うには、文字コードエンコードというのを意識する必要があります。
ここでは、Shift-JIS、UTF-8、Unicodeといった、文字コード・エンコードがらみでよく出てくる用語について、ご説明いたします。
また、テキストファイルを扱う際に意識しておきたい改行コードについても、併せて言及いたします。

文字コードとは

はじめに

文字コードとは、コンピュータ上で文字を扱うために、文字に割り当てられた固有の番号のことです。
コンピュータでは2進数しか扱えないため、文字を数字(2進数の集まり)に置き換えて扱っています。
このときの文字⇒数字への置き換えの方法に、何種類かのルールがあるため、文字を書き込んだときのルールで読み込まないと、いわゆる文字化けを起こしてしまい、文字を読み込めません。
先ほど、『文字コードとは、文字に割り当てられた番号』と述べましたが、一般的には、『文字⇒数字への置き換えルールの名称』を「文字コード」と呼ぶことが多いです。

また、「文字コード」というのは広義の分類であり、正確には「符号化文字集合」 と 「文字符号化方式」を総称して、「文字コード」と呼びます。
この説明は非常に難しいのですが(と言うか私もちゃんと理解できていないと思います・・・)ざっくり言うと、以下のような感じです。

  • 符号化文字集合:文字の種類についてのルール
  • 文字符号化形式:テキストファイルの保存方法についてのルール
    エンコード」と言うことも多いです

符号化文字集合の代表例

ASCII英数字・記号を扱うための規格。ANSI(米国規格協会)が定めた。
JIS X 0201英数字・記号に加え、半角カナを扱えるようにした規格。JIS(日本産業規格)が定めた。
JIS X 0208日本語(全角ひらがな・カタカナ・漢字)を扱うための規格。JIS(日本産業規格)が定めた。
Unicode日本語、ロシア語、ギリシャ語、記号……など、世界中のほとんど全ての文字をカバーできるようにした規格。
当初は2バイトで表そうとしたが、世界中の文字を収録するには2バイトでは足りなかった。
そのため、4 バイトで表される文字(サロゲートペアと呼びます)もある。
JIS X 0208では扱えない「㉑」などの記号や、「𠮷」などの文字(サロゲートペア)を扱える。

文字符号化形式(エンコードの種類)の代表例

Shift_JISJIS X 0201とJIS X 0208を扱うためにMicrosoftが開発した方式。
UTF-8Unicodeを扱う方式(ASCIIも包括する)。英数字は1バイト、日本語は3~4バイトの可変長で表現する。
Webサイトで広く使われており、Windows11のメモ帳ではデフォルトで扱う方式になった。
UTF-16Unicodeを扱う方式(ASCIIも包括する)。2~4バイトの可変長で表現する。

Unicodeでしか扱えない文字の制約

Visual Basic Editorで扱えない

Visual Basic Editorにて、㉑のようにUnicodeでしか扱えない文字を入力しようとすると、下図のように「?」に化けてしまいます。

VBAのDir関数で扱えない

指定されたフォルダ内のファイル名を返す「Dir関数」ですが、ファイル名にUnicodeでしか扱えない文字(㉑など)が含まれると、これまた「?」に化けてしまいます。
※そもそもVisual Basic Editorで扱えない文字なので、他にも扱えないVBA関数があるかもしれません。

例:「C:\work」フォルダに、「サンプル㉑.txt」 というファイルを置いておく

VBAにてDir関数を実行

Sheets("Sheet1").Range("A1") = Dir("C:\work\サンプル*")

「㉑」が「?」に化けて出力された

回避方法

ちょっと面倒ですが、以下のように「FileSystemObject」というのを使うと、㉑のような文字も扱えます。
ざっくりですが、コメントに説明を書いておきました。

Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject") 'FileSystemObjectを作成

Dim objFolder As Object
Set objFolder = objFso.GetFolder("C:\work")         'フォルダをObject変数にSet

Dim objFile As Object                               'ファイル情報取得用のObject変数

Dim Ix1 As Integer: Ix1 = 1                         'Excelの行番号カウント用
For Each objFile In objFolder.Files                 'フォルダ内のファイルを1つずつ取得
    Sheets("Sheet1").Cells(Ix1, 1) = objFile.Name   'ファイル名を出力
    Ix1 = Ix1 + 1
Next

「㉑」が化けずに出力された

「BOM」について

「BOM」とは?

Unicodeで書かれたテキストファイルの先頭に付ける、「このファイルはUnicodeで書かれています」ということを示す3バイトの目印データのことです。

BOMあり/なしでのExcelとAccessでの扱い

BOMが無いCSVファイルは、Excelで開いたときに文字化けが起こります。
一方で、BOMが有るCSVファイルは、Accessでインポートできません。
つまり、下表のようになります。

BOMExcelAccess
あり○(開ける)×(インポート不可)
なし×(開けない)○(インポート可)

BOMの付け外しをVBAで行う方法

かなり長くなりますので(と言ってもソースのコピペで対応可能ですが)、「大体でIT」様の下記サイトをご覧いただければと思います。

エンコードの種類の判別方法

テキストファイルにはエンコードの種類を完全に判別する仕組みはありません(BOM付きを除く)。
「XXというバイトは、文字コードYYYにしか出現しないから、エンコードの種類はYYYだ!」と判別するしかありません。
「じゃあ具体的にどうやるの?」ということですが、こちらもかなり長くなりますので、「ddxb-0x41」様のQiitaの下記記事をご覧いただければと思います。

ちなみに、テキストエディタでファイルを開くと、自動判定されたエンコードの種類と、BOMの有無が表示されます。
以下は、Windows 11のメモ帳の例です。

なお、Windows 11のメモ帳以外で、システム開発でよく使われるエディタ(VS Code、サクラエディタ、秀丸エディタ、など)では、エンコードの種類と、BOMの有無を変更できる機能が備わっています。

改行コードについて

最後に、改行コードの違いについてご説明いたします。
「改行」を表す文字コードには、下表の通り3種類があります。
OSによって、扱う文字コードが違うのですが、「Excelのセル内改行については、vbLfが使われる」ことを、知っておくと良いです。異なる改行コードが混在するファイルを扱うときに、ハマりやすいポイントです。

VBAでの定数名16進でのコード値VBAのChr関数を
使った表記方法
用途
vbCrLf0x0D + 0x0A
の2バイトの組合せ
Chr(13) & Chr(10)Windows OSで使われている。
vbCr0x0DChr(13)MacOS 9以前で使われている。
vbLf0x0AChr(10)Unix, Linux, MacOS(9以降), Androidで使われている。
また、Excelのセル内改行も、このコードである。

コメント

タイトルとURLをコピーしました