|
文字コード判定のサンプル(VB.NET)

|
<このサンプルの概要>
このプログラムは以下の流れで文字コードを判定しています。
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を示すコード)
存在しなければUNICODEの可能性を確率として計算する。
・2バイト目が&H00の時は2点加算(1バイト目は判定しない)
・2バイト目が&H01〜&H33の時は2点加算(1バイト目は判定しない)
・2バイト目が&H34〜&H4Dの時は0点として判定終了
・2バイト目が&H4E〜&H9Fの時は2点加算(1バイト目は判定しない)
・2バイト目が&HA0〜&HABの時は0点として判定終了
・2バイト目が&HAC〜&HD7の時は0点として判定終了
・2バイト目が&HD8〜&DFの時は2点加算(1バイト目は判定しない)
・2バイト目が&HE0〜&F7の時は0点として判定終了
・2バイト目が&HF8〜&FFの時は2点加算(1バイト目は判定しない)
計算結果の点数をチェックしたバイト数の2倍で割り確率%を計算する。
全てが複数バイトコードなので100%になる。
UNICODEでは無いと判定した時は0%になる。
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倍の点数を加算
(最後の文字の余分な付加ビットが0で無ければ無効)
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.各文字コードの確率を比較し文字コードを判定する。
VB6版のサンプルソースもあります。
文字コード判定のサンプル(VB6)
「ネット(Web)で手軽に文字コード判定サービス!!」をお試し頂けます。
文字コード判定ツール.NET
関連情報
ADODB.Streamによる文字コード変換のサンプル(VB6/VB.NET)
WideCharToMultiByteとMultiByteToWideCharによる文字コード変換のサンプル(VB6/VB.NET)
文字コード判定&変換ツール.NET
文字コード判定/変換ツール(VB6のソース付)
★標準モジュール(Module1.vb)
Module Module1
'**********************************************************************
' 機能名 : Module1.vb
' 機能説明 : 文字コード判定
' 備考 :
' 著作権 : Copyright(C) 2008 のん All rights reserved
' : このプログラムは、日本国著作権法および国際条約により保護
' : されています。このプログラムを転載する場合は著作権所有者
' : の許可が必要となります。
'**********************************************************************
Private Const JUDGEFIX = 9999 '文字コード決定%
Private Const JUDGESIZEMAX = 10000 '文字コード判定バイト数
Private Const SingleByteWeight = 1 '1バイト 文字コードの一致重み
Private Const Multi_ByteWeight = 2 '複数バイト文字コードの一致重み
Private Enum JISMODE 'JISコードのモード
ctrl = 0 '制御コード
asci = 1 'ASCII
roma = 2 'JISローマ字
kana = 3 'JISカナ(半角カナ)
kanO = 4 '旧JIS漢字 (1978)
kanN = 5 '新JIS漢字 (1983/1990)
kanH = 6 'JIS補助漢字
End Enum
'----文字コード判定
' 関数名 : JudgeCode
' 返り値 : 判定結果文字コード名
' 引き数 : bytCode : 判定文字データ
' 機能説明 : 文字コードを判定する
' 備考 :
Public Function JudgeCode(ByRef bytCode() As Byte) As String
JudgeCode = "SJIS"
Dim dblSJIS As Double
Dim dblJIS As Double
Dim dblEUC As Double
Dim dblUNI As Double
Dim dblUTF7 As Double
Dim dblUTF8 As Double
dblJIS = JudgeJIS(bytCode, True) : System.Diagnostics.Trace.WriteLine("JIS :" & dblJIS)
If dblJIS >= JUDGEFIX Then JudgeCode = "JIS" : Exit Function
dblUNI = JudgeUNI(bytCode, True) : System.Diagnostics.Trace.WriteLine("UNI :" & dblUNI)
If dblUNI >= JUDGEFIX Then JudgeCode = "UNICODE" : Exit Function
dblUTF8 = JudgeUTF8(bytCode, True) : System.Diagnostics.Trace.WriteLine("UTF8:" & dblUTF8)
If dblUTF8 >= JUDGEFIX Then JudgeCode = "UTF8" : Exit Function
dblUTF7 = JudgeUTF7(bytCode, True) : System.Diagnostics.Trace.WriteLine("UTF7:" & dblUTF7)
If dblUTF7 >= JUDGEFIX Then JudgeCode = "UTF7" : Exit Function
dblSJIS = JudgeSJIS(bytCode, True) : System.Diagnostics.Trace.WriteLine("SJIS:" & dblSJIS)
If dblSJIS >= JUDGEFIX Then JudgeCode = "SJIS" : Exit Function
dblEUC = JudgeEUC(bytCode, True) : System.Diagnostics.Trace.WriteLine("EUC :" & dblEUC)
If dblEUC >= JUDGEFIX Then JudgeCode = "EUC" : Exit Function
System.Diagnostics.Trace.WriteLine("--------")
If dblSJIS >= dblSJIS And dblSJIS >= dblUNI And dblSJIS >= dblJIS And _
dblSJIS >= dblUTF7 And dblSJIS >= dblUTF8 And dblSJIS >= dblEUC Then
JudgeCode = "SJIS"
Exit Function
End If
If dblUNI >= dblSJIS And dblUNI >= dblUNI And dblUNI >= dblJIS And _
dblUNI >= dblUTF7 And dblUNI >= dblUTF8 And dblUNI >= dblEUC Then
JudgeCode = "UNICODE"
Exit Function
End If
If dblJIS >= dblSJIS And dblJIS >= dblUNI And dblJIS >= dblJIS And _
dblJIS >= dblUTF7 And dblJIS >= dblUTF8 And dblJIS >= dblEUC Then
JudgeCode = "JIS"
Exit Function
End If
If dblUTF7 >= dblSJIS And dblUTF7 >= dblUNI And dblUTF7 >= dblJIS And _
dblUTF7 >= dblUTF7 And dblUTF7 >= dblUTF8 And dblUTF7 >= dblEUC Then
JudgeCode = "UTF7"
Exit Function
End If
If dblUTF8 >= dblSJIS And dblUTF8 >= dblUNI And dblUTF8 >= dblJIS And _
dblUTF8 >= dblUTF7 And dblUTF8 >= dblUTF8 And dblUTF8 >= dblEUC Then
JudgeCode = "UTF8"
Exit Function
End If
If dblEUC >= dblSJIS And dblEUC >= dblUNI And dblEUC >= dblJIS And _
dblEUC >= dblUTF7 And dblEUC >= dblUTF8 And dblEUC >= dblEUC Then
JudgeCode = "EUC"
Exit Function
End If
End Function
'----SJIS関係
' 関数名 : JudgeSJIS
' 返り値 : 判定結果確率(%)
' 引き数 : bytCode : 判定文字データ
' : fixFlag : 確定判断有無
' 機能説明 : 判定文字データの判定確率を計算する
' 備考 :
Private Function JudgeSJIS(ByRef bytCode() As Byte, _
Optional ByVal fixFlag As Boolean = False) As Double
Dim i As Long
Dim dblFit As Double
Dim dblUB As Double
dblUB = JUDGESIZEMAX - 1
If dblUB > UBound(bytCode) Then
dblUB = UBound(bytCode)
End If
For i = 0 To dblUB
'81-9F,E0-EF(1バイト目)
If (bytCode(i) >= &H81 And bytCode(i) <= &H9F) Or _
(bytCode(i) >= &HE0 And bytCode(i) <= &HEF) Then
If i <= UBound(bytCode) - 1 Then
'40-7E,80-FC(2バイト目)
If (bytCode(i + 1) >= &H40 And bytCode(i + 1) <= &H7E) Or _
(bytCode(i + 1) >= &H80 And bytCode(i + 1) <= &HFC) Then
dblFit = dblFit + (2 * Multi_ByteWeight)
i = i + 1
End If
End If
'A1-DF(1バイト目)
ElseIf (bytCode(i) >= &HA1 And bytCode(i) <= &HDF) Then
dblFit = dblFit + (1 * SingleByteWeight)
'20-7E(1バイト目)
ElseIf (bytCode(i) >= &H20 And bytCode(i) <= &H7E) Then
dblFit = dblFit + (1 * SingleByteWeight)
'00-1F, 7F(1バイト目)
ElseIf (bytCode(i) >= &H0 And bytCode(i) <= &H1F) Or _
bytCode(i) = &H7F Then
dblFit = dblFit + (1 * SingleByteWeight)
End If
Next i
JudgeSJIS = (dblFit * 100) / ((dblUB + 1) * Multi_ByteWeight)
End Function
'----JIS関係
' 関数名 : JudgeJIS
' 返り値 : 判定結果確率(%)
' 引き数 : bytCode : 判定文字データ
' : fixFlag : 確定判断有無
' 機能説明 : 判定文字データの判定確率を計算する
' 備考 :
Private Function JudgeJIS(ByRef bytCode() As Byte, _
Optional ByVal fixFlag As Boolean = False) As Double
Dim i As Long
Dim dblFit As Double
Dim dblUB As Double
Dim lngMode As JISMODE
dblUB = JUDGESIZEMAX - 1
If dblUB > UBound(bytCode) Then
dblUB = UBound(bytCode)
End If
For i = 0 To dblUB
'1B(1バイト目)
If bytCode(i) = &H1B Then
If i <= UBound(bytCode) - 2 Then
'28 42(2・3バイト目)
If bytCode(i + 1) = &H28 And bytCode(i + 1) <= &H42 Then
lngMode = JISMODE.asci
dblFit = dblFit + (3 * Multi_ByteWeight)
i = i + 2
If fixFlag Then
JudgeJIS = JUDGEFIX
Exit Function
End If
End If
'28 4A(2・3バイト目)
If bytCode(i + 1) = &H28 And bytCode(i + 1) <= &H4A Then
lngMode = JISMODE.roma
dblFit = dblFit + (3 * Multi_ByteWeight)
i = i + 2
If fixFlag Then
JudgeJIS = JUDGEFIX
Exit Function
End If
End If
'28 49(2・3バイト目)
If bytCode(i + 1) = &H28 And bytCode(i + 1) <= &H49 Then
lngMode = JISMODE.kana
dblFit = dblFit + (3 * Multi_ByteWeight)
i = i + 2
If fixFlag Then
JudgeJIS = JUDGEFIX
Exit Function
End If
End If
'24 40(2・3バイト目)
If bytCode(i + 1) = &H24 And bytCode(i + 1) <= &H40 Then
lngMode = JISMODE.kanO
dblFit = dblFit + (3 * Multi_ByteWeight)
i = i + 2
If fixFlag Then
JudgeJIS = JUDGEFIX
Exit Function
End If
End If
'24 42(2・3バイト目)
If bytCode(i + 1) = &H24 And bytCode(i + 1) <= &H42 Then
lngMode = JISMODE.kanN
dblFit = dblFit + (3 * Multi_ByteWeight)
i = i + 2
If fixFlag Then
JudgeJIS = JUDGEFIX
Exit Function
End If
End If
'24 44(2・3バイト目)
If bytCode(i + 1) = &H24 And bytCode(i + 1) <= &H44 Then
lngMode = JISMODE.kanH
dblFit = dblFit + (3 * Multi_ByteWeight)
i = i + 2
If fixFlag Then
JudgeJIS = JUDGEFIX
Exit Function
End If
End If
End If
Else
Select Case lngMode
Case JISMODE.ctrl, JISMODE.asci, JISMODE.roma
'00-1F,7F
If (bytCode(i) >= &H0 And bytCode(i) <= &H1F) Or _
bytCode(i) = &H7F Then
dblFit = dblFit + (1 * SingleByteWeight)
End If
'20-7E
If (bytCode(i) >= &H20 And bytCode(i) <= &H7E) Then
dblFit = dblFit + (1 * SingleByteWeight)
End If
Case JISMODE.kana
'21-5F
If (bytCode(i) >= &H21 And bytCode(i) <= &H5F) Then
dblFit = dblFit + (1 * SingleByteWeight)
End If
Case JISMODE.kanO, JISMODE.kanN, JISMODE.kanH
If i <= UBound(bytCode) - 1 Then
'21-7E
If (bytCode(i) >= &H21 And bytCode(i) <= &H7E) And _
(bytCode(i - 1) >= &H21 And bytCode(i - 1) <= &H7E) Then
dblFit = dblFit + (2 * Multi_ByteWeight)
i = i + 1
End If
End If
End Select
End If
Next i
JudgeJIS = (dblFit * 100) / ((dblUB + 1) * Multi_ByteWeight)
End Function
'----EUC関係
' 関数名 : JudgeEUC
' 返り値 : 判定結果確率(%)
' 引き数 : bytCode : 判定文字データ
' : fixFlag : 確定判断有無
' 機能説明 : 判定文字データの判定確率を計算する
' 備考 :
Private Function JudgeEUC(ByRef bytCode() As Byte, _
Optional ByVal fixFlag As Boolean = False) As Double
Dim i As Long
Dim dblFit As Double
Dim dblUB As Double
dblUB = JUDGESIZEMAX - 1
If dblUB > UBound(bytCode) Then
dblUB = UBound(bytCode)
End If
For i = 0 To dblUB
'8E(1バイト目) + A1-DF(2バイト目)
If bytCode(i) = &H8E Then
If i <= UBound(bytCode) - 1 Then
If bytCode(i + 1) >= &HA1 And bytCode(i + 1) <= &HDF Then
dblFit = dblFit + (2 * Multi_ByteWeight)
i = i + 1
End If
End If
'8F(1バイト目) + A1-0xFE(2・3バイト目)
ElseIf bytCode(i) = &H8F Then
If i <= UBound(bytCode) - 2 Then
If (bytCode(i + 1) >= &HA1 And bytCode(i + 1) <= &HFE) And _
(bytCode(i + 2) >= &HA1 And bytCode(i + 2) <= &HFE) Then
dblFit = dblFit + (3 * Multi_ByteWeight)
i = i + 2
End If
End If
'A1-FE(1バイト目) + A1-FE(2バイト目)
ElseIf bytCode(i) >= &HA1 And bytCode(i) <= &HFE Then
If i <= UBound(bytCode) - 1 Then
If bytCode(i + 1) >= &HA1 And bytCode(i + 1) <= &HFE Then
dblFit = dblFit + (2 * Multi_ByteWeight)
i = i + 1
End If
End If
'20-7E(1バイト目)
ElseIf (bytCode(i) >= &H20 And bytCode(i) <= &H7E) Then
dblFit = dblFit + (1 * SingleByteWeight)
'00-1F, 7F(1バイト目)
ElseIf (bytCode(i) >= &H0 And bytCode(i) <= &H1F) Or _
bytCode(i) = &H7F Then
dblFit = dblFit + (1 * SingleByteWeight)
End If
Next i
JudgeEUC = (dblFit * 100) / ((dblUB + 1) * Multi_ByteWeight)
End Function
'----UNICODE関係
' 関数名 : JudgeUNI
' 返り値 : 判定結果確率(%)
' 引き数 : bytCode : 判定文字データ
' : fixFlag : 確定判断有無
' 機能説明 : 判定文字データの判定確率を計算する
' 備考 :
Private Function JudgeUNI(ByRef bytCode() As Byte, _
Optional ByVal fixFlag As Boolean = False) As Double
Dim i As Long
Dim dblFit As Double
Dim dblUB As Double
dblUB = JUDGESIZEMAX - 1
If dblUB > UBound(bytCode) Then
dblUB = UBound(bytCode)
End If
For i = 0 To dblUB
'00,80-FF
If (bytCode(i) = &H0 Or bytCode(i) >= &H80) Then Exit For
Next
If i >= dblUB Then
JudgeUNI = 0
Exit Function
End If
For i = 0 To dblUB
If fixFlag Then
'BOM
If bytCode(i) = &HFF Then
If i <= UBound(bytCode) - 1 Then
If bytCode(i + 1) = &HFE Then
JudgeUNI = JUDGEFIX
Exit Function
End If
End If
End If
'半角の証
'If bytCode(i) = &H0 Then
' JudgeUNI = JUDGEFIX
' Exit Function
'End If
End If
If i <= UBound(bytCode) - 1 Then
'00(2バイト目)
If (bytCode(i + 1) = &H0) Then
'00-FF(1バイト目)
dblFit = dblFit + (2 * Multi_ByteWeight)
'01-33(2バイト目)
ElseIf (bytCode(i + 1) >= &H1 And bytCode(i + 1) <= &H33) Then
'00-FF(1バイト目)
dblFit = dblFit + (2 * Multi_ByteWeight)
'34-4D(2バイト目)
ElseIf (bytCode(i + 1) >= &H34 And bytCode(i + 1) <= &H4D) Then
'00-FF(1バイト目)----空き----
dblFit = 0
Exit For
'4E-9F(2バイト目)
ElseIf (bytCode(i + 1) >= &H4E And bytCode(i + 1) <= &H9F) Then
'00-FF(1バイト目)
dblFit = dblFit + (2 * Multi_ByteWeight)
'A0-AB(2バイト目)
ElseIf (bytCode(i + 1) >= &HA0 And bytCode(i + 1) <= &HAB) Then
'00-FF(1バイト目)----空き----
dblFit = 0
Exit For
'AC-D7(2バイト目)
ElseIf (bytCode(i + 1) >= &HAC And bytCode(i + 1) <= &HD7) Then
'00-FF(1バイト目)----ハングル----
dblFit = 0
Exit For
'D8-DF(2バイト目)
ElseIf (bytCode(i + 1) >= &HD8 And bytCode(i + 1) <= &HDF) Then
'00-FF(1バイト目)
dblFit = dblFit + (2 * Multi_ByteWeight)
'E0-F7(2バイト目)
ElseIf (bytCode(i + 1) >= &HE0 And bytCode(i + 1) <= &HF7) Then
'00-FF(1バイト目)----外字----
dblFit = 0
Exit For
'F8-FF(2バイト目)
ElseIf (bytCode(i + 1) >= &HF8 And bytCode(i + 1) <= &HFF) Then
'00-FF(1バイト目)
dblFit = dblFit + (2 * Multi_ByteWeight)
End If
i = i + 1
End If
Next i
JudgeUNI = (dblFit * 100) / ((dblUB + 1) * Multi_ByteWeight)
End Function
'----UTF7関係
' 関数名 : JudgeUTF7
' 返り値 : 判定結果確率(%)
' 引き数 : bytCode : 判定文字データ
' : fixFlag : 確定判断有無
' 機能説明 : 判定文字データの判定確率を計算する
' 備考 :
Private Function JudgeUTF7(ByRef bytCode() As Byte, _
Optional ByVal fixFlag As Boolean = False) As Double
Dim i As Long
Dim dblFit As Double
Dim dblUB As Double
Dim lngWrk As Long
Dim str64 As String
Dim bln64 As Boolean
str64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
Dim lngBY As Long
Dim lngXB As Long
Dim lngXX As Long
dblUB = JUDGESIZEMAX - 1
If dblUB > UBound(bytCode) Then
dblUB = UBound(bytCode)
End If
lngWrk = 0
For i = 0 To dblUB
'+〜-まではBASE64ENCODE
If bytCode(i) = Asc("+") And bln64 = False Then
lngWrk = 1
bln64 = True
ElseIf bytCode(i) = Asc("-") Then
If lngWrk <= 0 Then
lngWrk = lngWrk + 1
dblFit = dblFit + (lngWrk * SingleByteWeight)
ElseIf lngWrk = 1 Then
lngWrk = lngWrk + 1
dblFit = dblFit + (lngWrk * Multi_ByteWeight)
ElseIf lngWrk >= 4 And lngXB < 6 And _
((InStr(str64, Chr(bytCode(i - 1))) - 1) And lngXX) = 0 Then
lngWrk = lngWrk + 1
dblFit = dblFit + (lngWrk * Multi_ByteWeight)
End If
lngWrk = 0
bln64 = False
Else
If bln64 = True Then
'BASE64ENCODE中
If InStr(str64, Chr(bytCode(i))) > 0 Then
lngBY = Int((lngWrk * 6) / 8)
lngXB = (lngWrk * 6) - (lngBY * 8)
lngXX = (2 ^ lngXB) - 1
lngWrk = lngWrk + 1
Else
lngWrk = 0
bln64 = False
End If
Else
'20-7E(1バイト目)
If (bytCode(i) >= &H20 And bytCode(i) <= &H7E) Then
dblFit = dblFit + (1 * SingleByteWeight)
'00-1F, 7F(1バイト目)
ElseIf (bytCode(i) >= &H0 And bytCode(i) <= &H1F) Or _
bytCode(i) = &H7F Then
dblFit = dblFit + (1 * SingleByteWeight)
End If
End If
End If
Next i
JudgeUTF7 = (dblFit * 100) / ((dblUB + 1) * Multi_ByteWeight)
End Function
'----UTF8関係
' 関数名 : JudgeUTF8
' 返り値 : 判定結果確率(%)
' 引き数 : bytCode : 判定文字データ
' : fixFlag : 確定判断有無
' 機能説明 : 判定文字データの判定確率を計算する
' 備考 :
Private Function JudgeUTF8(ByRef bytCode() As Byte, _
Optional ByVal fixFlag As Boolean = False) As Double
Dim i As Long
Dim dblFit As Double
Dim dblUB As Double
dblUB = JUDGESIZEMAX - 1
If dblUB > UBound(bytCode) Then
dblUB = UBound(bytCode)
End If
For i = 0 To dblUB
If fixFlag Then
'BOM
If bytCode(i) = &HEF Then
If i <= UBound(bytCode) - 2 Then
If bytCode(i + 1) = &HBB And _
bytCode(i + 2) = &HBF Then
JudgeUTF8 = JUDGEFIX
Exit Function
End If
End If
End If
End If
'AND FC(1バイト目) + 80-BF(2-6バイト目)
If (bytCode(i) And &HFC) = &HFC Then
If i <= UBound(bytCode) - 5 Then
If (bytCode(i + 1) >= &H80 And bytCode(i + 1) <= &HBF) And _
(bytCode(i + 2) >= &H80 And bytCode(i + 2) <= &HBF) And _
(bytCode(i + 3) >= &H80 And bytCode(i + 3) <= &HBF) And _
(bytCode(i + 4) >= &H80 And bytCode(i + 4) <= &HBF) And _
(bytCode(i + 5) >= &H80 And bytCode(i + 5) <= &HBF) Then
dblFit = dblFit + (6 * Multi_ByteWeight)
i = i + 5
End If
End If
'AND F8(1バイト目) + 80-BF(2-5バイト目)
ElseIf (bytCode(i) And &HF8) = &HF8 Then
If i <= UBound(bytCode) - 4 Then
If (bytCode(i + 1) >= &H80 And bytCode(i + 1) <= &HBF) And _
(bytCode(i + 2) >= &H80 And bytCode(i + 2) <= &HBF) And _
(bytCode(i + 3) >= &H80 And bytCode(i + 3) <= &HBF) And _
(bytCode(i + 4) >= &H80 And bytCode(i + 4) <= &HBF) Then
dblFit = dblFit + (5 * Multi_ByteWeight)
i = i + 4
End If
End If
'AND F0(1バイト目) + 80-BF(2-4バイト目)
ElseIf (bytCode(i) And &HF0) = &HF0 Then
If i <= UBound(bytCode) - 3 Then
If (bytCode(i + 1) >= &H80 And bytCode(i + 1) <= &HBF) And _
(bytCode(i + 2) >= &H80 And bytCode(i + 2) <= &HBF) And _
(bytCode(i + 3) >= &H80 And bytCode(i + 3) <= &HBF) Then
dblFit = dblFit + (4 * Multi_ByteWeight)
i = i + 3
End If
End If
'AND E0(1バイト目) + 80-BF(2-3バイト目)
ElseIf (bytCode(i) And &HE0) = &HE0 Then
If i <= UBound(bytCode) - 2 Then
If (bytCode(i + 1) >= &H80 And bytCode(i + 1) <= &HBF) And _
(bytCode(i + 2) >= &H80 And bytCode(i + 2) <= &HBF) Then
dblFit = dblFit + (3 * Multi_ByteWeight)
i = i + 2
End If
End If
'AND C0(1バイト目) + 80-BF(2バイト目)
ElseIf (bytCode(i) And &HC0) = &HC0 Then
If i <= UBound(bytCode) - 1 Then
If (bytCode(i + 1) >= &H80 And bytCode(i + 1) <= &HBF) Then
dblFit = dblFit + (2 * Multi_ByteWeight)
i = i + 1
End If
End If
'20-7E(1バイト目)
ElseIf (bytCode(i) >= &H20 And bytCode(i) <= &H7E) Then
dblFit = dblFit + (1 * SingleByteWeight)
'00-1F, 7F(1バイト目)
ElseIf (bytCode(i) >= &H0 And bytCode(i) <= &H1F) Or _
bytCode(i) = &H7F Then
dblFit = dblFit + (1 * SingleByteWeight)
End If
Next i
JudgeUTF8 = (dblFit * 100) / ((dblUB + 1) * Multi_ByteWeight)
End Function
End Module
★フォームモジュール(Form1.vb)
Private cod() As Byte
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ReDim cod(0)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim dlg As New OpenFileDialog
dlg.Filter = "すべてのファイル (*.*)|*.*"
If dlg.ShowDialog() = DialogResult.OK Then
Dim sr As System.IO.Stream = dlg.OpenFile()
Dim br As New System.IO.BinaryReader(sr)
ReDim cod(sr.Length - 1)
cod = br.ReadBytes(sr.Length)
br.Close()
sr.Close()
ComboBox1.Text = JudgeCode(cod)
If ComboBox1.Text = "SJIS" Then
TextBox1.Text = System.Text.Encoding.GetEncoding("SHIFT-JIS").GetString(cod)
ElseIf ComboBox1.Text = "JIS" Then
TextBox1.Text = System.Text.Encoding.GetEncoding("ISO-2022-JP").GetString(cod)
ElseIf ComboBox1.Text = "EUC" Then
TextBox1.Text = System.Text.Encoding.GetEncoding("EUC-JP").GetString(cod)
ElseIf ComboBox1.Text = "UNICODE" Then
TextBox1.Text = System.Text.Encoding.GetEncoding("UNICODE").GetString(cod)
ElseIf ComboBox1.Text = "UTF7" Then
TextBox1.Text = System.Text.Encoding.GetEncoding("UTF-7").GetString(cod)
ElseIf ComboBox1.Text = "UTF8" Then
TextBox1.Text = System.Text.Encoding.GetEncoding("UTF-8").GetString(cod)
End If
End If
End Sub
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
If UBound(cod) <= 0 Then
Exit Sub
End If
If ComboBox1.Text = "SJIS" Then
TextBox1.Text = System.Text.Encoding.GetEncoding("SHIFT-JIS").GetString(cod)
ElseIf ComboBox1.Text = "JIS" Then
TextBox1.Text = System.Text.Encoding.GetEncoding("ISO-2022-JP").GetString(cod)
ElseIf ComboBox1.Text = "EUC" Then
TextBox1.Text = System.Text.Encoding.GetEncoding("EUC-JP").GetString(cod)
ElseIf ComboBox1.Text = "UNICODE" Then
TextBox1.Text = System.Text.Encoding.GetEncoding("UNICODE").GetString(cod)
ElseIf ComboBox1.Text = "UTF7" Then
TextBox1.Text = System.Text.Encoding.GetEncoding("UTF-7").GetString(cod)
ElseIf ComboBox1.Text = "UTF8" Then
TextBox1.Text = System.Text.Encoding.GetEncoding("UTF-8").GetString(cod)
End If
End Sub