Excel VBAの覚え書(文字コード編)~ADOのStreamオブジェクトを使用した文字コード変換

2024-01-07

Excel VBAで取扱う主な文字コードは、ASCII、Shift-JIS、Unicodeの3つです。
本稿では、それぞれの文字コードの概要、文字コード関係の関数、文字コード変換の方法について、整理しておきたいと思います。

■Excel VBAで取扱う主な文字コード

ASCIIの概要

ASCII(アスキー、情報交換用米国標準コード、American Standard Code for Information Interchange)は、英語圏を中心に幅広く使用されている文字コードで、日本では「ISO-2022-JP」として規格化されています。
ASCIIの文字コードは7ビットなので、値は0(X’00’)~127(X’7F’)の128種類しかなく、X’00’~X’1F’とX’7F’が表示できない制御文字、X’20’~X’7E’に表示可能な文字が割当てられています。
表示可能な文字の内訳は、X’30’~X’39’が数字、X’41’~X’5A’が英大文字、X’61’~X’7A’が英小大文字、それ以外は記号類です。

日本語にはカナ文字があるため、ASCIIを8ビットに拡張したANK(アンク、Alphabet, Numerical digit, Katakana)が使用され、後に「JIS X 0201」として制定されました。
ANKの文字コードは8ビットなので、値は0(X’00’)~255(X’FF’)の256種類あり、X’00’~X’7F’はASCIIコードと同一、X’A0’~X’DF’にカナと記号を割当て、X’80’~X’9F’とX’E0’~X’FF’は未割当てとなっています。
「JIS X 0201」で定義されている文字は、下表の通りです。

0 1 2 3 4 5 6 7 8 9 A B C D E F
00 NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI
10 DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
20 SP ! # $ % & ' ( ) * + , . /
30 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
40 @ A B C D E F G H I J K L M N O
50 P Q R S T U V W X Y Z [ \ ] ^ _
60 ` a b c d e f g h i j k l m n o
70 p q r s t u v w x y z { | } ~ DEL
80 (未定義)
90 (未定義)
A0
B0 ソ
C0
D0
E0 (未定義)
F0 (未定義)

Shift-JISの概要

Shift-JIS(シフトジス)は、コンピュータ上で日本語を含む文字列を表現するために用いられる文字コードの一つで、「JIS X 0208」として規格化されています。
いわゆる半角文字を1バイト、全角文字を2バイトで表し、前項に掲載した表で割当てられている文字はそのまま1バイトコードとし、未割当ての部分を2バイトコード用に使用する方式です。

全角文字(漢字エリア)に割当てられている文字コードは以下の通りで、X’f040’以降は外字の割当て用エリアになっています。
・上位1バイト:X’81’~X’9f’、X’e0’~X’ef’
・下位1バイト:X’40’~X’7e’、X’80’~X’fc’
「JIS X 0208」の漢字エリアで定義されている文字は、下表の通りです。

0 1 2 3 4 5 6 7 8 9 A B C D E F
8140 ´ ¨
8150 _
8160
8170 ± ×
8180 ÷ °
8190 §
81A0
81B0
81C0
81D0
81E0
81F0
8200
8210
8220
8230
8240
8250
8260
8270
8280
8290
82A0
82B0
82C0
82D0
82E0
82F0
8300
8310
8320
8330
8340
8350
8360
8370
8380
8390 Α
83A0 Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ
83B0 Σ Τ Υ Φ Χ Ψ Ω α
83C0 β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ
83D0 σ τ υ φ χ ψ ω
83E0
83F0
8400
8410
8420
8430
8440 А Б В Г Д Е Ё Ж З И Й К Л М Н О
8450 П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю
8460 Я
8470 а б в г д е ё ж з и й к л м н
8480 о п р с т у ф х ц ч ш щ ъ ы ь э
8490 ю я
84A0
84B0
84C0
84D0
84E0
84F0
8500
8510
8520
8530
8540
8550
8560
8570
8580
8590
85A0
85B0
85C0
85D0
85E0
85F0
8600
8610
8620
8630
8640
8650
8660
8670
8680
8690
86A0
86B0
86C0
86D0
86E0
86F0
8700
8710
8720
8730
8740
8750
8760
8770
8780
8790
87A0
87B0
87C0
87D0
87E0
87F0
8800
8810
8820
8830
8840
8850
8860
8870
8880
8890
88A0
88B0
88C0
88D0
88E0
88F0
8900
8910
8920
8930
8940
8950
8960
8970
8980 沿
8990
89A0
89B0
89C0
89D0
89E0
89F0
8A00
8A10
8A20
8A30
8A40
8A50
8A60
8A70
8A80 橿
8A90
8AA0
8AB0
8AC0 竿
8AD0
8AE0
8AF0
8B00
8B10
8B20
8B30
8B40
8B50
8B60
8B70
8B80
8B90
8BA0
8BB0
8BC0
8BD0
8BE0
8BF0
8C00
8C10
8C20
8C30
8C40
8C50
8C60
8C70
8C80
8C90
8CA0
8CB0
8CC0
8CD0
8CE0
8CF0
8D00
8D10
8D20
8D30
8D40
8D50
8D60 稿
8D70
8D80
8D90
8DA0
8DB0
8DC0
8DD0
8DE0
8DF0
8E00
8E10
8E20
8E30
8E40
8E50
8E60 使
8E70 姿
8E80
8E90
8EA0 鹿
8EB0 湿
8EC0
8ED0
8EE0
8EF0 寿
8F00
8F10
8F20
8F30
8F40
8F50
8F60 宿
8F70 駿
8F80
8F90
8FA0
8FB0
8FC0
8FD0
8FE0
8FF0
9000
9010
9020
9030
9040
9050
9060
9070
9080
9090
90A0
90B0 西
90C0
90D0
90E0
90F0 穿
9100
9110
9120
9130
9140
9150
9160
9170
9180
9190
91A0
91B0
91C0
91D0 退
91E0
91F0
9200
9210
9220
9230
9240 辿
9250
9260
9270
9280
9290
92A0
92B0 調
92C0
92D0 椿
92E0
92F0
9300
9310
9320
9330
9340
9350
9360 殿
9370
9380
9390
93A0
93B0
93C0 禿
93D0
93E0
93F0 廿
9400
9410
9420
9430
9440 尿
9450
9460
9470
9480
9490
94A0
94B0
94C0
94D0
94E0
94F0
9500
9510
9520
9530
9540
9550
9560
9570
9580
9590
95A0
95B0
95C0
95D0 便
95E0 簿
95F0
9600
9610
9620
9630
9640
9650
9660 貿
9670
9680
9690 麿
96A0
96B0 婿
96C0 綿
96D0
96E0
96F0
9700
9710
9720
9730
9740
9750
9760 輿
9770 耀
9780
9790
97A0
97B0
97C0
97D0
97E0
97F0
9800
9810
9820
9830
9840
9850
9860
9870
9880
9890
98A0 丿
98B0
98C0
98D0
98E0
98F0
9900
9910
9920
9930
9940
9950
9960
9970
9980
9990
99A0
99B0
99C0
99D0
99E0
99F0
9A00
9A10
9A20
9A30
9A40
9A50
9A60
9A70
9A80
9A90
9AA0
9AB0
9AC0
9AD0
9AE0
9AF0
9B00
9B10
9B20
9B30
9B40
9B50
9B60
9B70
9B80
9B90
9BA0
9BB0
9BC0
9BD0
9BE0
9BF0 广
9C00
9C10
9C20
9C30
9C40
9C50
9C60 彿
9C70 忿
9C80
9C90
9CA0
9CB0
9CC0
9CD0
9CE0
9CF0
9D00
9D10
9D20
9D30
9D40
9D50
9D60
9D70
9D80
9D90
9DA0
9DB0
9DC0
9DD0
9DE0
9DF0
9E00
9E10
9E20
9E30
9E40
9E50
9E60
9E70
9E80
9E90
9EA0
9EB0
9EC0 榿
9ED0 槿
9EE0
9EF0
9F00
9F10
9F20
9F30
9F40
9F50
9F60 歿
9F70
E080
E090
E0A0
E0B0
E0C0
E0D0
E0E0
E0F0
E100
E110
E120
E130
E140
E150
E160
E170
E180
E190
E1A0
E1B0
E1C0
E1D0
E1E0
E1F0
E200
E210
E220
E230
E240
E250 祿
E260
E270
E280 窿
E290
E2A0
E2B0
E2C0
E2D0
E2E0
E2F0
E300
E310
E320
E330
E340 紿
E350
E360
E370
E380
E390 繿
E3A0
E3B0
E3C0
E3D0
E3E0
E3F0
E400
E410
E420
E430
E440
E450
E460
E470
E480
E490
E4A0
E4B0
E4C0
E4D0
E4E0
E4F0
E500
E510
E520
E530
E540
E550
E560
E570
E580
E590
E5A0
E5B0
E5C0
E5D0
E5E0
E5F0
E600
E610
E620
E630
E640
E650 覿
E660
E670
E680
E690
E6A0 谿
E6B0
E6C0
E6D0
E6E0
E6F0 跿
E700
E710
E720
E730
E740
E750
E760
E770
E780
E790
E7A0
E7B0
E7C0
E7D0
E7E0
E7F0
E800
E810
E820
E830
E840
E850
E860
E870
E880
E890
E8A0
E8B0
E8C0
E8D0
E8E0
E8F0
E900
E910
E920
E930
E940
E950
E960
E970
E980
E990
E9A0
E9B0
E9C0
E9D0
E9E0
E9F0 鴿
EA00
EA10
EA20
EA30
EA40
EA50
EA60
EA70
EA80
EA90
EAA0
EAB0
EAC0
EAD0
EAE0
EAF0
EB00
EB10
EB20
EB30
EB40
EB50
EB60
EB70
EB80
EB90
EBA0
EBB0
EBC0
EBD0
EBE0
EBF0
EC00
EC10
EC20
EC30
EC40
EC50
EC60
EC70
EC80
EC90
ECA0
ECB0
ECC0
ECD0
ECE0
ECF0
ED00
ED10
ED20
ED30
ED40
ED50 俿
ED60
ED70
ED80
ED90
EDA0
EDB0
EDC0
EDD0 氿
EDE0 溿
EDF0
EE00
EE10
EE20
EE30
EE40
EE50
EE60
EE70
EE80
EE90 譿
EEA0
EEB0
EEC0
EED0
EEE0
EEF0
EF00
EF10
EF20
EF30
EF40
EF50
EF60
EF70
EF80
EF90
EFA0
EFB0
EFC0
EFD0
EFE0
EFF0

Unicodeの概要

Unicode(ユニコード)は、「世界で使われる全ての文字を単一の文字セットで表そう」という考え方で定められた業界規格で、ほぼ互換性を保つ形で「ISO/IEC 10646」が規格化されています。Unicodeの規格は、文字コードを1~4バイトで表す「UTF-8」、文字コードを2バイトで表す「UTF-16」、文字コードを4バイトで表す「UTF-32」の3種類があります。

UTF-16はエンディアン(バイト順)の違いにより、「UTF-16」「UTF-16BE」「UTF-16LE」に細分化されます。「UTF-16」は先頭に2バイトのBOM(ボム、バイト順マーク、Byte Order Mark、値はU+FEFF)を持ち、BOMがX’FEFF’であればビッグエンディアン、BOMがX’FFFE’であればリトルエンディアンを表します。
「UTF-16BE」「UTF-16LE」は先頭にBOMを持たず、プロトコルやアプリケーションの設定等により、リトルエンディアンまたはビッグエンディアンに決め打ちする方式です。
Excel VBAの内部形式は「UTF-16LE」となっており、ASCIIやShift-JISで入力された文字は「UTF-16LE」に変換されて処理されます。

UTF-32もUTF-16と同様にエンディアンの違いにより、「UTF-32」「UTF-32BE」「UTF-32LE」に細分化されます。
「UTF-32」は先頭に4バイトのBOMを持ち、BOMがX’0000FEFF’であればビッグエンディアン、BOMがX’FFFE0000’であればリトルエンディアンを表します。
「UTF-32BE」「UTF-32LE」は先頭にBOMを持たず、プロトコルやアプリケーションの設定等により、リトルエンディアンまたはビッグエンディアンに決め打ちする方式です。

なお、UTF-8はBOMを必要としませんが、X’EFBBBF(U+FEFFのUTF-8での表現)’の3バイトがBOMとして付加されることがあります。

Wikipediaに掲載されている表がわかり易いので、少し加工して転載しておきます。

文字符号化形式(CEF) 文字符号化方式(CES) エンディアン BOMの付与
UTF-8 UTF-8 N/A
UTF-16 UTF-16 ビッグ/リトル
UTF-16BE ビッグ 不可
UTF-16LE リトル 不可
UTF-32 UTF-32 ビッグ/リトル
UTF-32BE ビッグ 不可
UTF-326LE リトル 不可

■文字コードを取扱う関数

VBAには文字コードを取扱う関数が用意されていますので、まとめて掲載しておきます。

Chr関数、ChrB関数、ChrW関数

明示的に文字コードを指定したい場合や制御文字のように文字列で指定できない文字を指定したい場合、Chr関数、ChrB関数、ChrW関数を使用します。

Chr関数
説明 指定した文字コードに対するShift-JISの文字列を返す
定義 Function Chr(charcode As Long) As String
ChrB関数
説明 指定した文字コードに対するASCIIの文字列を返す
定義 Function ChrB(charcode As Long) As String
ChrW関数
説明 指定した文字コードに対するUnicodeの文字列を返す
定義 Function ChrW(charcode As Long) As String

Asc関数、AscB関数、AscW関数

Chr関数、ChrB関数、ChrW関数は「文字コード指定すると、文字を返す」関数ですが、逆に「文字を指定すると、文字コードを返す」関数がAsc関数、AscB関数、AscW関数です。

Asc関数
説明 文字列の先頭文字の文字コードを返す

(※)戻り値は、1バイト文字セットに対しては0~255、2バイト文字セットに対しては-32768~32767。

定義 Function Asc(String As String) As Integer
AscB関数
説明 文字列の先頭文字の最初のバイトを返す
定義 Function AscB(String As String) As Byte
AscW関数
説明 文字列の先頭文字のUnicode文字コードを返す
定義 Function AscW(String As String) As Integer

VBAのStringsクラスには文字列を取扱う関数が集められており、これ以外に文字列の長さを返すLen関数・LenB関数、文字列を検索するInStr関数・InStrB関数・InStrRev関数、文字列を置換するReplace関数、文字列を比較するStrComp関数、文字列を結合するJoin関数、文字列を分割するSplit関数、文字列を逆順に並べ替えるStrReverse関数等が提供されています。
⇒VBAのStringsクラスについては、Excel VBAリファレンス(VBA(Visual Basic for Applications)編)を参照して下さい。

■ADOのStreamオブジェクトの詳細

最近ではUTF-8を使用したデータが増えてきましたが、Excel VBAでそのまま取扱うと文字化けするので、UTF-16LEへの文字コード変換が必要になります。
Excel VBAで利用可能なオブジェクトとして、ADO(ActiveX Data Objects)のStreamオブジェクトを紹介します。
⇒ADO(ActiveX Data Objects)については、Excel VBAでオブジェクト指向プログラミング(ADO編)を参照して下さい。

Streamオブジェクトのメソッド

Streamオブジェクトで提供されているメソッドは下表の通りです。

Cancelメソッド
説明 保留中の非同期メソッド呼び出しの実行を取消す
定義 Sub Cancel()
Closeメソッド
説明 開いているオブジェクトおよび関連する全てのオブジェクトを閉じる
定義 Sub Close()
CopyToメソッド
説明 指定した文字数またはバイト数のデータを別のStreamオブジェクトにコピーする
定義 Sub CopyTo(DestStream As _Stream, [CharNumber As Long = -1])
Flushメソッド
説明 ADOバッファに残っているStreamの内容を基になるオブジェクトに反映する
定義 Sub Flush()
LoadFromFileメソッド
説明 既存のファイルの内容をストリームに読み込む
定義 Sub LoadFromFile(FileName As String)
Openメソッド
説明 バイナリデータまたはテキストデータのストリームを操作するためにStreamオブジェクトを開く

(※)ConnectModeEnum列挙体の値は、以下の通り。
adModeRead(1):読み取り専用のアクセス許可
adModeReadWrite(3):読み取り/書き込みのアクセス許可
adModeRecursive(0x400000):全てのサブレコードに共有の制限を伝達
adModeShareDenyNone(16):任意のアクセス許可で開くことを許可
adModeShareDenyRead(4):読み取りモードで開くことを禁止
adModeShareDenyWrite(8):書き込みモードで開くことを禁止
adModeShareExclusive(12):他のユーザが開くことを禁止
adModeUnknown(0):アクセス許可が設定されていないか、確認できない
adModeWrite(2):書き込み専用のアクセス許可

(※)StreamOpenOptionsEnum列挙体の値は、以下の通り。
adOpenStreamAsync(1):非同期モードでStreamオブジェクトを開く
adOpenStreamFromRecord(4):開かれているRecordオブジェクトとして識別
adOpenStreamUnspecified(-1):既定のオプションでStreamオブジェクトを開く

定義 Sub Open(Source As Variant, [Mode As ConnectModeEnum = adModeUnknown], [Options As StreamOpenOptionsEnum = adOpenStreamUnspecified], [UserName As String], [Password As String])
Readメソッド
説明 バイナリ型のStreamオブジェクトから指定したバイト数を読み取る
定義 Function Read([NumBytes As Long = -1]) As Variant
ReadTextメソッド
説明 文字列型のStreamオブジェクトから指定された文字数を読み取る
定義 Function ReadText([NumChars As Long = -1]) As String
SaveToFileメソッド
説明 ストリームのバイナリの内容をファイルに保存する

(※)SaveOptionsEnum列挙体の値は、以下の通り。
adSaveCreateNotExist(1):ファイルが存在しない場合は新しいファイルを作成
adSaveCreateOverWrite(2):ファイルが存在する場合はファイルを上書き

定義 Sub SaveToFile(FileName As String, [Options As SaveOptionsEnum = adSaveCreateNotExist])
SetEOSメソッド
説明 ストリームの末尾の位置を設定する
定義 Sub SetEOS()
SkipLineメソッド
説明 テキストストリームの1行全体をスキップする
定義 Sub SkipLine()
Writeメソッド
説明 バイナリデータをStreamオブジェクトに書き込む
定義 Sub Write(Buffer As Variant)
WriteTextメソッド
説明 指定したテキスト文字列をStreamオブジェクトに書き込む

(※)StreamWriteEnum列挙体の値は、以下の通り。
adWriteChar(0):指定したテキスト文字列を書き込む
adWriteLine(1):テキスト文字列と行区切り記号を書き込む

定義 Sub WriteText(Data As String, [Options As StreamWriteEnum = adWriteChar])

Streamオブジェクトのプロパティ

Streamオブジェクトで提供されているプロパティは下表の通りです。

Charsetプロパティ
説明 テキストストリームの内容を変換してStreamオブジェクトの内部バッファに格納するための文字セットを設定/取得
定義 Property Charset() As String
EOSプロパティ(読み取り専用)
説明 現在の位置がストリームの末尾にあるかどうかを取得(Trueの場合、末尾)
定義 Property EOS() As Boolean
LineSeparatorプロパティ
説明 テキストストリームの行区切り文字として使用するバイナリ文字を設定/取得

(※)LineSeparatorEnum列挙体の値は、以下の通り。
adCR(13):CR
adCRLF(-1):CRLF(既定値)
adLF(10):LF

定義 Property LineSeparator() As LineSeparatorEnum
Modeプロパティ
説明 Streamオブジェクトで使用可能なデータ変更権限を設定/取得

(※)ConnectModeEnum列挙体の値は、以下の通り。
adModeRead(1):読み取り専用のアクセス許可
adModeReadWrite(3):読み取り/書き込みのアクセス許可
adModeRecursive(0x400000):全てのサブレコードに共有の制限を伝達
adModeShareDenyNone(16):任意のアクセス許可で開くことを許可
adModeShareDenyRead(4):読み取りモードで開くことを禁止
adModeShareDenyWrite(8):書き込みモードで開くことを禁止
adModeShareExclusive(12):他のユーザが開くことを禁止
adModeUnknown(0):アクセス許可が設定されていないか、確認できない
adModeWrite(2):書き込み専用のアクセス許可

定義 Property Mode() As ConnectModeEnum
Positionプロパティ
説明 Streamオブジェクト内の現在の位置を設定/取得
定義 Property Position() As Long
Sizeプロパティ(読み取り専用)
説明 Parameterオブジェクトの最大サイズをバイト数または文字数で取得
定義 Property Size() As Long
Stateプロパティ(読み取り専用)
説明 指定したオブジェクトの状態を取得

(※)ObjectStateEnum列挙体の値は、以下の通り(単一の値または合算値)。
adStateClosed(0):オブジェクトが閉じている
adStateOpen(1):オブジェクトが開いている
adStateConnecting(2):オブジェクトが接続している
adStateExecuting(4):オブジェクトがコマンドを実行している
adStateFetching(8):オブジェクトの行が取得されている

定義 Property State() As ObjectStateEnum
Typeプロパティ
説明 Streamオブジェクトに格納されているデータの種類を設定/取得

(※)StreamTypeEnum列挙体の値は、以下の通り。
adTypeBinary(1):バイナリデータ
adTypeText(2):テキストデータ(既定値)

定義 Property Type() As StreamTypeEnum

■ADOのStreamオブジェクトを使用した文字コード変換

ADOのStreamオブジェクトを使用するための手順と文字コード変換の具体例を紹介します。

ADOのStreamオブジェクトを使用するための事前準備

ADOのStreamオブジェクトを使用するための事前準備は、以下の3ステップです。
⇒オブジェクトを使用するための事前準備とオブジェクトブラウザによる調査方法については、Excel VBAでオブジェクト指向プログラミング(事前準備編)を参照して下さい。

①ライブラリの参照設定
Visual Basic Editor(VBE)のファイルメニューから[ツール]-[参照設定]を選択し、参照設定ダイアログでMicrosoft ActiveX Data Objects x.x Libraryのチェックボックスにチェックを入れ、[OK]ボタンを押下。

(補足説明)
『x.x』の部分だけ異なる項目が複数表示されます。
筆者は深く考えずに一番数字の大きいものを選んでいますが、Microsoftのドキュメントを見ると、ADOとWindowsの対応関係が下表のようになっているようなので、Windowsのバージョンに合ったライブラリを選択するのが本来の姿かと思います。

ADOのバージョン Windowsのバージョン
ADO 2.8 Windows XP
ADO 6.0 Windows Vista
ADO 6.1 Windows 7

②オブジェクト変数の定義
プログラムの宣言部でオブジェクト変数を定義。

  1. Dim adoSt As ADODB.Stream

③インスタンスの生成
プログラムの処理部でインスタンスを生成。

  1. Set adoSt = New ADODB.Stream
  2. 'ここにADODB.Streamを使用した処理を記述
  3. Set adoSt = Nothing

ADOのStreamオブジェクトを使用した文字コード変換の例(UTF-8→UTF-16LE)

ファイル解析用に作成した「BinaryFileクラス」という、自作のクラス・モジュールを開示していますが、UTF-8のデータをUTF-16LEに変換してExcelで取扱えるようにするため、「GetDataUTF8メソッド」を追加しました。
⇒BinaryFileクラスについては、Excel VBAでファイル解析(事前準備編)を参照して下さい。

このGetDataUTF8メソッドで使用する、UTF-8をUTF-16LEに変換する関数を以下に掲載します。
この関数は引数としてUTF-8のデータをバイト型の配列で受け取り、ADOのStreamオブジェクトでUTF-16LEに変換し、戻り値としてUTF-16LEのデータを文字列型で返すものです。

以下にプログラムを掲載しますが、行番号8~10で一時ファイルにバイナリモードで書き出し、行番号14~17で一時ファイルを"UTF-8″指定でStreamオブジェクトに取り込み、行番号18~21でStreamオブジェクトから文字列に読み込み、行番号23で一時ファイルを削除しています。

  1. Public Function GetStringA(ByRef bytBuf() As Byte) As String
  2.     Dim adoSt As ADODB.Stream
  3.     Dim TEMPpath As String
  4.     Dim TEMPnum As Integer
  5.     TEMPpath = “C:\work\temp.txt"
  6.     TEMPnum = FreeFile
  7.     Open TEMPpath For Binary Access Write As #TEMPnum
  8.     Put #TEMPnum, , bytBuf
  9.     Close #TEMPnum
  10.     GetStringA = “"
  11.     Set adoSt = New ADODB.Stream
  12.     With adoSt
  13.         .Type = adTypeText
  14.         .Charset = “UTF-8"
  15.         .Open
  16.         .LoadFromFile (TEMPpath)
  17.         Do While Not (.EOS)
  18.             GetStringA = GetStringA & .ReadText(adReadLine)
  19.         Loop
  20.         .Close
  21.     End With
  22.     Kill (TEMPpath)
  23.     Set adoSt = Nothing
  24. End Function

ADOのStreamオブジェクトを使用した文字コード変換の例(UTF-16LE→UTF-8)

前掲の関数とは逆にUTF-16LEのデータをUTF-8に変換する関数です。
この関数は引数としてUTF-16LEのデータを文字列型で受け取り、ADOのStreamオブジェクトでUTF-8に変換し、戻り値としてUTF-8のデータをバイト型の配列で返すものです。

以下にプログラムを掲載しますが、行番号10~13で文字列を"UTF-8″指定でStreamオブジェクトに書き込み、行番号14~15でStreamオブジェクトから一時ファイルに保存し、行番号17~20で一時ファイルをバイナリモードで読み込み、行番号21で一時ファイルを削除しています。

  1. Public Function getBytesA(ByVal strBuf As String) As Byte()
  2.     Dim adoSt As ADODB.Stream
  3.     Dim TEMPpath As String
  4.     Dim TEMPnum As Integer
  5.     TEMPpath = “C:\work\temp.txt"
  6.     TEMPnum = FreeFile
  7.     Set adoSt = New ADODB.Stream
  8.     With adoSt
  9.         .Type = adTypeText
  10.         .Charset = “UTF-8"
  11.         .Open
  12.         .WriteText strBuf, adWriteLine
  13.         .SaveToFile TEMPpath, adSaveCreateOverWrite
  14.         .Close
  15.     End With
  16.     Open TEMPpath For Binary As #TEMPnum
  17.     ReDim getBytesA(0 To FileLen(TEMPpath) – 1)
  18.     Get #TEMPnum, , getBytesA
  19.     Close #TEMPnum
  20.     Kill (TEMPpath)
  21.     Set adoSt = Nothing
  22. End Function

(おまけ)Shift-JISの文字コード表を出力するExcelツール

本稿の中にShift-JISの文字コード表を掲載しましたが、この表(HTMLの<table>~</table>の部分)は以下のExcelツールで作成したものです。

  1. Dim fso As FileSystemObject
  2. Dim ts As TextStream
  3. Dim otxt As String
  4. Dim i, j As Integer
  5. Private Sub Sample1()
  6.     Set fso = New FileSystemObject
  7.     otxt = “<table style=""font-size: 6px; text-align: center; height: 10px; width: 35px;""><tbody>" & vbCrLf
  8.     otxt = otxt & “<tr><th></th><th>0</th><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th><th>6</th><th>7</th><th>8</th><th>9</th><th>A</th><th>B</th><th>C</th><th>D</th><th>E</th><th>F</th></tr>" & vbCrLf
  9.     For i = &H8140 To &H9F7E Step 16
  10.         otxt = otxt & “<tr><th>" & Hex(i) & “</th>"
  11.         For j = 0 To 15
  12.             otxt = otxt & “<td>" & Chr(i + j) & “</td>"
  13.         Next j
  14.         otxt = otxt & “</tr>" & vbCrLf
  15.     Next i
  16.     For i = &HE080 To &HEFFC Step 16
  17.         otxt = otxt & “<tr><th>" & Hex(i) & “</th>"
  18.         For j = 0 To 15
  19.             otxt = otxt & “<td>" & Chr(i + j) & “</td>"
  20.         Next j
  21.         otxt = otxt & “</tr>" & vbCrLf
  22.     Next i
  23.     otxt = otxt & “</tbody></table>" & vbCrLf
  24.     Set ts = fso.OpenTextFile(“C:\work\Shift-JIS.txt", ForWriting, True)
  25.     ts.Write (otxt)
  26.     ts.Close
  27.     Set fso = Nothing
  28. End Sub

 

国本温子(著),緑川吉行(著),できるシリーズ編集部(著)
出版社:インプレス
発売日:2022/3/23
単行本(ソフトカバー):A5判/912ページ

大村あつし(著),古川順平(著)
出版社:技術評論社
発売日:2021/1/9
単行本(ソフトカバー):A5判/800ページ

高橋宣成(著)
出版社:技術評論社
発売日:2019/11/25
単行本(ソフトカバー):B5変形判/576ページ

覚え書

Posted by hides