NonSoft

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


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

ADODB.Streamを使用するためには、参照設定が必要になります。
「adodb」を追加してお試しください。

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

VB6版のサンプルソースもあります。
ADODB.Streamによる文字コード変換のサンプル(VB6)

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

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

★標準モジュール(Module1.vb)
Module Module1
    '****************************************************************************
    ' 機能名    : modADOS.bas
    ' 機能説明  : ADODB.Streamによる文字コード変換
    ' 備考      :
    ' 著作権    : Copyright(C) 2008 のん 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
        objStm = New ADODB.Stream
        objStm.Open()
        objStm.Type = ADODB.StreamTypeEnum.adTypeText
        objStm.Charset = cset
        objStm.WriteText(strUni)

        objStm.Position = 0
        objStm.Type = ADODB.StreamTypeEnum.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()
        objStm = Nothing

        Exit Function
ErrHandler:
        System.Diagnostics.Trace.WriteLine("文字コード変換エラー:" & Err.Description)
        If objStm Is Nothing = False Then objStm.Close()
        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
        objStm = New ADODB.Stream
        objStm.Open()
        objStm.Type = ADODB.StreamTypeEnum.adTypeBinary
        objStm.Write(bytIn)

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

        objStm.Close()
        objStm = Nothing

        Exit Function
ErrHandler:
        System.Diagnostics.Trace.WriteLine("文字コード変換エラー:" & Err.Description)
        If objStm Is Nothing = False Then objStm.Close()
        objStm = Nothing
    End Function
End Module

★フォームモジュール(Form1.vb)
    Private Sub Button1_Click( _
        ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim org As String = "あいうえお亜意卯絵尾アイウエオ1234512345"
        Dim bytOut() As Byte = ADOS_Encode_UTF8(org)
        Dim strStr As String = ADOS_Decode_UTF8(bytOut)
        If org = strStr Then
            MsgBox("(OK)" & strStr)
        Else
            MsgBox("(NG)" & strStr)
        End If
    End Sub

ADODB.Streamは、キャラクタセット名に_autodetectを指定すると文字コードを自動判別して、
UNICODEに文字コード変換してくれます。興味津々で試してみました。試したソースは以下です。
結果は、残念ながら意図した結果にはなりませんでした。原因調査中。。。ADODB.Streamの
キャラクタセット名に_autodetectを指定しても殆ど正しく文字コード判別してくれ無いのかも
知れません。

Private Sub Button2_Click( _
    ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Dim strIn As String = "あいうえお亜意卯絵尾アイウエオ1234512345"
    Dim strOut As String

    strOut = ADODB_Stream("_autodetect", _
        System.Text.Encoding.GetEncoding("SHIFT-JIS").GetBytes(strIn))
    If strIn = strOut Then
        ' 文字コード判別成功
        System.Diagnostics.Trace.WriteLine("ADODB.Stream(OK)" & "SHIFT-JIS")
    Else
        ' 文字コード判別失敗
        System.Diagnostics.Trace.WriteLine("ADODB.Stream(NG)" & "SHIFT-JIS")
    End If

    strOut = ADODB_Stream("_autodetect", _
        System.Text.Encoding.GetEncoding("ISO-2022-JP").GetBytes(strIn))
    If strIn = strOut Then
        ' 文字コード判別成功
        System.Diagnostics.Trace.WriteLine("ADODB.Stream(OK)" & "ISO-2022-JP")
    Else
        ' 文字コード判別失敗
        System.Diagnostics.Trace.WriteLine("ADODB.Stream(NG)" & "ISO-2022-JP")
    End If

    strOut = ADODB_Stream("_autodetect", _
        System.Text.Encoding.GetEncoding("EUC-JP").GetBytes(strIn))
    If strIn = strOut Then
        ' 文字コード判別成功
        System.Diagnostics.Trace.WriteLine("ADODB.Stream(OK)" & "EUC-JP")
    Else
        ' 文字コード判別失敗
        System.Diagnostics.Trace.WriteLine("ADODB.Stream(NG)" & "EUC-JP")
    End If

    strOut = ADODB_Stream("_autodetect", _
        System.Text.Encoding.GetEncoding("UNICODE").GetBytes(strIn))
    If strIn = strOut Then
        ' 文字コード判別成功
        System.Diagnostics.Trace.WriteLine("ADODB.Stream(OK)" & "UNICODE")
    Else
        ' 文字コード判別失敗
        System.Diagnostics.Trace.WriteLine("ADODB.Stream(NG)" & "UNICODE")
    End If

    strOut = ADODB_Stream("_autodetect", _
        System.Text.Encoding.GetEncoding("UTF-7").GetBytes(strIn))
    If strIn = strOut Then
        ' 文字コード判別成功
        System.Diagnostics.Trace.WriteLine("ADODB.Stream(OK)" & "UTF-7")
    Else
        ' 文字コード判別失敗
        System.Diagnostics.Trace.WriteLine("ADODB.Stream(NG)" & "UTF-7")
    End If

    strOut = ADODB_Stream("_autodetect", _
        System.Text.Encoding.GetEncoding("UTF-8").GetBytes(strIn))
    If strIn = strOut Then
        ' 文字コード判別成功
        System.Diagnostics.Trace.WriteLine("ADODB.Stream(OK)" & "UTF-8")
    Else
        ' 文字コード判別失敗
        System.Diagnostics.Trace.WriteLine("ADODB.Stream(NG)" & "UTF-8")
    End If
End Sub

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

    Dim objStm As ADODB.Stream
    objStm = New ADODB.Stream
    objStm.Open()
    objStm.Type = ADODB.StreamTypeEnum.adTypeBinary
    objStm.Write(bytIn)

    objStm.Position = 0
    objStm.Type = ADODB.StreamTypeEnum.adTypeText
    objStm.Charset = cset
    ADODB_Stream = objStm.ReadText()

    objStm.Close()
    objStm = Nothing

    Exit Function
ErrHandler:
    System.Diagnostics.Trace.WriteLine("文字コード変換エラー:" & Err.Description)
    If objStm Is Nothing = False Then objStm.Close()
    objStm = Nothing
End Function

<実行結果>
ADODB.Stream(OK)SHIFT-JIS
ADODB.Stream(OK)ISO-2022-JP
ADODB.Stream(NG)EUC-JP
ADODB.Stream(NG)UNICODE
ADODB.Stream(NG)UTF-7
ADODB.Stream(NG)UTF-8