NonSoft

文字コード変換/文字コード判定の
サンプル(VB6/VB.NET)の概要


 ち〜な〜み〜に〜

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

その他の機能としては「文字コード判定のサンプル」のモジュールによる文字コード判定、BOM 付加/削除、改行コードがあります。100%完璧な文字コード判定は難しいですが出来るだけ精度の高い判定を目指しています。 BOMとはUNICODEやUTF-8を判別するためにファイルの先頭付くコードで、UNICODEの時は&HFF,&HFE、UTF-8の時は&HEF,&HBB,&HBF です。

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

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

文字コード判定のサンプル(VB6)の概要
文字コード判定のサンプル(VB.NET)の概要
文字コード判定のサンプル(VB6)は以下の流れで文字コードを判定しています。
100%完璧な文字コード判定は難しいですが出来るだけ精度の高い判定を目指しています。

1.JIS(ISO-2022-JP)判定
  以下の制御コード列が存在したらJIS(ISO-2022-JP)と判定とする。
  ・&H1B, &H28, &H42 (ASCII)
  ・&H1B, &H28, &H4A (JISローマ字)
  ・&H1B, &H28, &H49 (JISカナ字)
  ・&H1B, &H24, &H40 (旧JIS漢字)
  ・&H1B, &H24, &H42 (新JIS漢字)
  ・&H1B, &H24, &H44 (JIS補助漢字)
  存在しなければ他の文字コードと判定する。

2.UNICODE判定
  以下の制御コード列が存在したらUNICODEと判定とする。
  ・&HFF, &HFE (BOM:UNICODEを示すコード)
  NUL(&H00)が存在したらUNICODEの可能性が高いためUNICODEと判定する。
  存在しなければ他の文字コードと判定する。

3.UTF-8判定
  以下の制御コード列が存在したらUTF-8と判定とする。
  ・&HEF, &HBB, &HBF (BOM:UTF-8を示すコード)
  存在しなければUTF-8の可能性を確率として計算する。
  ・1バイト目に&HFCのビットが立っていて2〜6バイト目が&H80〜&HBFの時はバイト数(この場合は6バイト)の2倍の点数を加算
  ・1バイト目に&HF8のビットが立っていて2〜5バイト目が&H80〜&HBFの時はバイト数(この場合は5バイト)の2倍の点数を加算
  ・1バイト目に&HF0のビットが立っていて2〜4バイト目が&H80〜&HBFの時はバイト数(この場合は4バイト)の4倍の点数を加算
  ・1バイト目に&HE0のビットが立っていて2〜3バイト目が&H80〜&HBFの時はバイト数(この場合は3バイト)の2倍の点数を加算
  ・1バイト目に&HC0のビットが立っていて2バイト目が&H80〜&HBFの時はバイト数(この場合は2バイト)の2倍の点数を加算
  ・1バイト目が&H00〜&H7Fの時は1点加算
  計算結果の点数をチェックしたバイト数の2倍で割り確率%を計算する。全てが複数バイトコードの場合は100%、
  全てが半角コードの場合は50%になる。(複数バイトコードが一致した時は確率が高くなる)

4.UTF-7判定
  UTF-7の可能性を確率として計算する。
  ・'+'〜'-'の間にBASE64文字が存在する時は'+'〜'-'のバイト数の2倍の点数を加算
   BASE64=(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/)
  ・1バイト目が&H00〜&H7Fの時は1点加算
  計算結果の点数をチェックしたバイト数の2倍で割り確率%を計算する。全てが複数バイトコードの場合は100%、
  全てが半角コードの場合は50%になる。(複数バイトコードが一致した時は確率が高くなる)

5.SJIS判定
  SJISの可能性を確率として計算する。
  ・1バイト目が&H81〜&H9F、&HE0〜&HEFで2バイト目が&H40〜&H7E、&H80〜&HFCの時はバイト数(この場合は2バイト)
   の2倍の点数を加算
  ・1バイト目が&HA1〜&HDFの時は1点加算
  ・1バイト目が&H00〜&H7Fの時は1点加算
  計算結果の点数をチェックしたバイト数の2倍で割り確率%を計算する。全てが複数バイトコードの場合は100%、
  全てが半角コードの場合は50%になる。(複数バイトコードが一致した時は確率が高くなる)

6.EUC判定
  EUCの可能性を確率として計算する。
  ・1バイト目が&H8Eで2バイト目が&HA1〜&HDFの時はバイト数(この場合は2バイト)の2倍の点数を加算
  ・1バイト目が&H8Fで2、3バイト目が&HA1〜&HFEの時はバイト数(この場合は3バイト)の2倍の点数を加算
  ・1バイト目が&HA1〜&HFEで2バイト目が&HA1〜&HFEの時はバイト数(この場合は2バイト)の2倍の点数を加算
  ・1バイト目が&H00〜&H7Fの時は1点加算
  計算結果の点数をチェックしたバイト数の2倍で割り確率%を計算する。全てが複数バイトコードの場合は100%、
  全てが半角コードの場合は50%になる。(複数バイトコードが一致した時は確率が高くなる)

7.各文字コードの確率を比較し文字コードを判定する。
  ・UTF-7の確率が他のコードの確率以上で、50%超の時はUTF-7と判定する。(50%以下の時はSJISの可能性が高い)
  ・UTF-8の確率が他のコードの確率超である時はUFT-8と判定する。
  ・EUCの確率が他のコードの確率超である時はEUCと判定する。
  ・その他の時はSJISと判定する。