|
|||||
<このサンプルの概要> 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 |