|
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)
関連情報
WideCharToMultiByteとMultiByteToWideCharによる文字コード変換のサンプル(VB6/VB.NET)
文字コード判定のサンプル(VB6/VB.NET)
文字コード判定&変換ツール.NET
文字コード判定/変換ツール(VB6のソース付)
★標準モジュール(Module1.vb)
Module Module1
'**********************************************************************
' 機能名 : modADOS.bas
' 機能説明 : ADODB.Streamによる文字コード変換
' 備考 :
' 著作権 : Copyright(C) 2008 のん All rights reserved
' : このプログラムは、日本国著作権法および国際条約により保護
' : されています。このプログラムを転載する場合は著作権所有者
' : の許可が必要となります。
'**********************************************************************
'---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