NonSoft

ADODB.Streamによる文字コード変換のサンプル(VB6)


 サンプル(ソース/コード)
<このサンプルの概要>
ADODB.Streamを使用しSJIS、JIS、EUC、UTF-7、UTF-8 からVB6内部文字コードであるUNIC
ODE(UTF-16)に変換します。また、UNICODEからの逆変換もします。全ての文字コードをUN
ICODEに変換出来て、その逆変換も出来れば全ての文字コード間の変換がUNICODEを通して
出来る事になります。UNICODEを通す事による処理速度等は気にしていません。

ADODB.Streamを使用するためには、参照設定が必要になります。
「Microsoft AxtiveX Data Objects X.X Library」を追加してお試しください。
このサンプルでは「Microsoft AxtiveX Data Objects 2.5 Library」を使用しています。

ADOで文字コード変換とは、意外でしたが結構簡単に出来ます。
WideCharToMultiByteと MultiByteToWideCharによる文字コード変換ではEUCが変換出来ま
せんでしたが、ADODB.Streamでは変換出来ます。また、ADODB.Streamは品質も良く、今の
ところ文字化けを発見していません。

VB.NET版のサンプルソースもあります。
.NETではADODB.Streamを使う必要が無いと思いますが、
.NETからADODB.Streamを呼び出す勉強として作ってみました。
ADODB.Streamによる文字コード変換のサンプル(VB.NET)

もっと簡単に文字コード変換を実現したい場合はこちらのDLLがおすすめです。
文字コード判定/変換DLL(VB6/VB.NET/C#.NET)

関連情報
WideCharToMultiByteとMultiByteToWideCharによる文字コード変換のサンプル(VB6/VB.NET)
文字コード判定のサンプル(VB6/VB.NET)
文字コード判定&変換ツール.NET
文字コード判定/変換ツール(VB6のソース付)

Option Explicit
'****************************************************************************
' 機能名    : modADOS.bas
' 機能説明  : ADODB.Streamによる文字コード変換
' 備考      :
' 著作権    : Copyright(C) 2007 のん All rights reserved
' ---------------------------------------------------------------------------
' 使用条件  : このサイトの内容を使用(流用/改変/転載/等全て)した成果物を不特定
'           : 多数に公開/配布する場合は、このサイトを参考にした旨を記述してく
'           : ださい。(例)WEBページやReadMeにリンクを貼ってください
' ---------------------------------------------------------------------------
'****************************************************************************

'---Shift-JIS関係
' 関数名    : ADOS_Encode_SJIS
' 返り値    : SJIS文字データ
' 引き数    : strUni: UNICODE文字データ
' 機能説明  : UNICODE文字データをSJISに変換する
' 備考      : ADODB.Streamによる文字コード変換
Public Function ADOS_Encode_SJIS(ByRef strUni As String) As Byte()
    ADOS_Encode_SJIS = ADOS_Encode("Shift_JIS", strUni)
End Function

' 関数名    : ADOS_Decode_SJIS
' 返り値    : UNICODE文字列
' 引き数    : bytIn : SJIS文字データ
' 機能説明  : SJIS文字データをUNICODEに変換する
' 備考      : ADODB.Streamによる文字コード変換
Public Function ADOS_Decode_SJIS(ByRef bytIn() As Byte) As String
    ADOS_Decode_SJIS = ADOS_Decode("Shift_JIS", bytIn)
End Function

'---JIS関係
' 関数名    : ADOS_Encode_JIS
' 返り値    : JIS文字データ
' 引き数    : strUni: UNICODE文字データ
' 機能説明  : UNICODE文字データをJISに変換する
' 備考      : ADODB.Streamによる文字コード変換
Public Function ADOS_Encode_JIS(ByRef strUni As String) As Byte()
    ADOS_Encode_JIS = ADOS_Encode("ISO-2022-JP", strUni)
End Function

' 関数名    : ADOS_Decode_JIS
' 返り値    : UNICODE文字列
' 引き数    : bytIn : JIS文字データ
' 機能説明  : JIS文字データをUNICODEに変換する
' 備考      : ADODB.Streamによる文字コード変換
Public Function ADOS_Decode_JIS(ByRef bytIn() As Byte) As String
    ADOS_Decode_JIS = ADOS_Decode("ISO-2022-JP", bytIn)
End Function

'---EUC関係
' 関数名    : ADOS_Encode_EUC
' 返り値    : EUC文字データ
' 引き数    : strUni: UNICODE文字データ
' 機能説明  : UNICODE文字データをEUCに変換する
' 備考      : ADODB.Streamによる文字コード変換
Public Function ADOS_Encode_EUC(ByRef strUni As String) As Byte()
    ADOS_Encode_EUC = ADOS_Encode("EUC-JP", strUni)
End Function

' 関数名    : ADOS_Decode_EUC
' 返り値    : UNICODE文字列
' 引き数    : bytIn : EUC文字データ
' 機能説明  : EUC文字データをUNICODEに変換する
' 備考      : ADODB.Streamによる文字コード変換
Public Function ADOS_Decode_EUC(ByRef bytIn() As Byte) As String
    ADOS_Decode_EUC = ADOS_Decode("EUC-JP", bytIn)
End Function

'---UTF-7関係
' 関数名    : ADOS_Encode_UTF7
' 返り値    : UTF7文字データ
' 引き数    : strUni: UNICODE文字データ
' 機能説明  : UNICODE文字データをUTF7に変換する
' 備考      : ADODB.Streamによる文字コード変換
Public Function ADOS_Encode_UTF7(ByRef strUni As String) As Byte()
    ADOS_Encode_UTF7 = ADOS_Encode("UTF-7", strUni)
End Function

' 関数名    : ADOS_Decode_UTF7
' 返り値    : UNICODE文字列
' 引き数    : bytIn : UTF7文字データ
' 機能説明  : UTF7文字データをUNICODEに変換する
' 備考      : ADODB.Streamによる文字コード変換
Public Function ADOS_Decode_UTF7(ByRef bytIn() As Byte) As String
    ADOS_Decode_UTF7 = ADOS_Decode("UTF-7", bytIn)
End Function

'---UTF-8関係
' 関数名    : ADOS_Encode_UTF8
' 返り値    : UTF8文字データ
' 引き数    : strUni: UNICODE文字データ
' 機能説明  : UNICODE文字データをUTF8に変換する
' 備考      : ADODB.Streamによる文字コード変換
Public Function ADOS_Encode_UTF8(ByRef strUni As String) As Byte()
    ADOS_Encode_UTF8 = ADOS_Encode("UTF-8", strUni)
End Function

' 関数名    : ADOS_Decode_UTF8
' 返り値    : UNICODE文字列
' 引き数    : bytIn : UTF8文字データ
' 機能説明  : UTF8文字データをUNICODEに変換する
' 備考      : ADODB.Streamによる文字コード変換
Public Function ADOS_Decode_UTF8(ByRef bytIn() As Byte) As String
    ADOS_Decode_UTF8 = ADOS_Decode("UTF-8", bytIn)
End Function

'---共通関数
' 関数名    : ADOS_Encode
' 返り値    : 出力文字データ
' 引き数    : cset  : 出力文字データのキャラクタセット名
'           : strUni: UNICODE文字データ
' 機能説明  : UNICODE文字データを指定のコードに変換する
' 備考      : ADODB.Streamによる文字コード変換
Private Function ADOS_Encode(ByVal cset As String, ByRef strUni As String) As Byte()
    On Error GoTo ErrHandler

    Dim objStm As ADODB.Stream
    Set objStm = New ADODB.Stream
    objStm.Open
    objStm.Type = adTypeText
    objStm.Charset = cset
    objStm.WriteText strUni

    objStm.Position = 0
    objStm.Type = adTypeBinary
    Select Case UCase(cset)
      Case "UNICODE", "UTF-16"
        objStm.Position = 2
      Case "UTF-8"
        objStm.Position = 3
    End Select
    ADOS_Encode = objStm.Read()

    objStm.Close
    Set objStm = Nothing

    Exit Function
ErrHandler:
    Debug.Print "文字コード変換エラー:" & Err.Description
    If objStm Is Nothing = False Then objStm.Close
    Set objStm = Nothing
End Function

' 関数名    : ADOS_Decode
' 返り値    : UNICODE文字列
' 引き数    : cset  : 入力文字データのキャラクタセット名
'           : bytIn : 入力文字データ
' 機能説明  : 入力文字データをUNICODEに変換する
' 備考      : ADODB.Streamによる文字コード変換
Private Function ADOS_Decode(ByVal cset As String, ByRef bytIn() As Byte) As String
    On Error GoTo ErrHandler

    Dim objStm As ADODB.Stream
    Set objStm = New ADODB.Stream
    objStm.Open
    objStm.Type = adTypeBinary
    objStm.Write bytIn

    objStm.Position = 0
    objStm.Type = adTypeText
    objStm.Charset = cset
    ADOS_Decode = objStm.ReadText()

    objStm.Close
    Set objStm = Nothing

    Exit Function
ErrHandler:
    Debug.Print "文字コード変換エラー:" & Err.Description
    If objStm Is Nothing = False Then objStm.Close
    Set objStm = Nothing
End Function