コード表は載せないよ。だって、テーブル作るのめんどっちィんだもん。
さて、今度もめんどくさい処理が目白押しだよ。
EUC → SJIS コード変換では上位バイトを基準にしたんで、その逆の SJIS → EUC コード変換では、下位バイトを基準にしなきゃ駄目。
さて、1バイト文字は SJIS・EUC 共通なので変換処理は必要はない。問題はやはり2バイト文字だね。2バイト文字は、
SJIS上位バイト≧ &H81 かつ SJIS下位バイト ≧ &HA1
が条件となる。ここで気をつけないといけないことは、半角カタカナの存在だよ。半角カタカナは、SJISでは1バイトに対し、EUC では2バイトとなる。SJIS の半角カタカナの範囲は、&HA0 〜 &HDF となっていて、2バイト文字条件の 上位バイト≧ &H81 の範囲内なんだよね。従って、2バイト文字かを判定する前に、半角カタカナであるかを判定する必要がある。半角カタカナであれば、
EUC上位バイト = &H8E
EUC下位バイト = SJIS上位バイト
とすればよい。さっき言ったけど、SJISでは1バイト、EUCでは2バイトなんで、変換後のバッファは、最大で、変換前のバッファの2倍必要ということになるね。ここのところは重要だよ。
これで半角カタカナの説明は終わり。今度は漢字・ひらがな等の純粋(?)な2バイト文字の変換処理だよ。冒頭でも言ったけど、SJIS下位バイトを基準にして考える。EUC上位バイト・EUC下位バイトの両者とも、
&H40 ≦ SJIS下位バイト ≦ &H9E と
&H9F ≦ SJIS下位バイト ≦ &HFC
のときで場合わけをして考える。ここからが複雑になっていく。
EUC上位バイトは、SJIS上位バイトが &H81 〜 &H9F のときと &HE0 〜 &HEF のときで分けて処理をする。EUC下位バイトは &H40 ≦ SJIS下位バイト ≦ &H9E のとき、EUC下位バイト > &H7F であるかで場合わけする。また、&H9F ≦ SJIS下位バイト ≦ &HFC のときは簡単な計算をする。これを文字で書いていたんではわけが分からなくなってくるので表で示すことにする。ついでに、半角カタカナの処理も載せておくね。
◎半角カタカナ |
SJIS下位バイトが &HA1 〜 &HDF のとき |
|
|
EUC上位バイト = &H8E |
|
|
EUC下位バイト = SJIS上位バイト |
|
|
|
|
|
◎半角カタカナを除く2バイト文字 |
EUC上位バイト |
SJIS下位バイトが &H40 〜 &H9E のとき |
|
SJIS下位バイトが &H9F 〜 &HFC のとき |
・SJIS上位バイトが &H81 〜 &H9F のとき |
|
・SJIS上位バイトが &H81 〜 &H9F のとき |
EUC上位バイト = 2 X SJIS上位バイト - 97 |
|
EUC上位バイト = 2 X SJIS上位バイト - 96 |
・SJIS上位バイトが &HE0 〜 &HEF のとき |
|
・SJIS上位バイトが &HE0 〜 &HEF のとき |
EUC上位バイト = 2 X SJIS上位バイト - 225 |
|
EUC上位バイト = 2 X SJIS上位バイト - 224 |
|
|
|
EUC下位バイト |
|
SJIS下位バイトが &H40 〜 &H9E のとき |
|
SJIS下位バイトが &H9F 〜 &HFC のとき |
・EUC下位バイト > &H7F のとき |
|
・EUC下位バイト = SJIS下位バイト + &H2 |
EUC下位バイト = SJIS下位バイト + &H60 |
|
|
・そうでないなら |
|
|
EUC下位バイト = SJIS下位バイト + &H61 |
|
|
表で見ると分かりやすいでしょ。例によって、独自に数列で処理しているから変な数式がたくさんあるよ。まあ、気にしないでね。それではさっさとコーディングしましょ。
'-----------------------------------------------------------
' 関数名: SJisToEUC
' 機能 : S-JISをEUCコードコードに変換する
' 引数 : (in) srcFileName … ファイル名(変換前)
' (in) dstFileName … ファイル名(変換後)
' 返り値: 正常:True エラー:False
'-----------------------------------------------------------
Public Function SJisToEUC(ByVal srcFileName As String, ByVal dstFileName As String) As Boolean
Dim srcBinLen As String '変換前文字列バイト数
Dim gHighASC As Byte 'Unicode文字1バイト目の値(上位)
Dim gLowASC As Byte 'Unicode文字2バイト目の値(下位)
Dim i As Long '作業用
Dim PreBinBuff() As Byte '変換前のバイトデータ
Dim BinBuffMain() As Byte '変換後のバイトデータ
Dim BinIndex As Long 'BinBuffMain のインデックス
Dim FileNum As Integer 'ファイルナンバー
On Error GoTo ErrHandler
'ファイルナンバー取得
FileNum = FreeFile
'ファイル読み込み
Open srcFileName For Binary Access Read As #FileNum
srcBinLen = LOF(FileNum) 'ファイルサイズ取得
ReDim Preserve PreBinBuff(srcBinLen + 1) As Byte
'全文字カタカナの場合を考慮して2倍バッファを確保する
ReDim Preserve BinBuffMain(srcBinLen * 2) As Byte
Get #FileNum, , PreBinBuff
Close #FileNum
'1バイト分余分にループ
For i = 0 To srcBinLen - 1
'アスキーコードを取得
gHighASC = PreBinBuff(i) '上位
gLowASC = PreBinBuff(i + 1) '下位
'半角カタカナ
If &HA0 <= gHighASC And gHighASC <= &HDF Then
BinBuffMain(BinIndex) = &H8E
BinBuffMain(BinIndex + 1) = gHighASC
BinIndex = BinIndex + 2
'全角コード
ElseIf gHighASC >= &H81 And gLowASC >= &H40 Then
'下位バイトが &h40〜&H9Eのとき
If &H40 <= gLowASC And gLowASC <= &H9E Then
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
' 上位バイト設定
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
'上位バイトが &H81〜&H9Fのとき
If &H81 <= gHighASC And gHighASC <= &H9F Then
BinBuffMain(BinIndex) = 2 * gHighASC - 97
'上位バイトが &HE0〜&HEFのとき
ElseIf &HE0 <= gHighASC And gHighASC <= &HEF Then
BinBuffMain(BinIndex) = 2 * gHighASC - 225
End If
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
' 下位バイト設定
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
If gLowASC > &H7F Then
BinBuffMain(BinIndex + 1) = gLowASC + &H60
Else
BinBuffMain(BinIndex + 1) = gLowASC + &H61
End If
'下位バイトが &h9F〜&HFCのとき
ElseIf &H9F <= gLowASC And gLowASC <= &HFC Then
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
' 上位バイト設定
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
'上位バイトが &H81〜&H9Fのとき
If &H81 <= gHighASC And gHighASC <= &H9F Then
BinBuffMain(BinIndex) = 2 * gHighASC - 96
'上位バイトが &HE0〜&HEFのとき
ElseIf &HE0 <= gHighASC And gHighASC <= &HEF Then
BinBuffMain(BinIndex) = 2 * gHighASC - 224
End If
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
' 下位バイト設定
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
BinBuffMain(BinIndex + 1) = gLowASC + &H2
End If
i = i + 1
BinIndex = BinIndex + 2
'半角コード
Else
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
' 上位バイト設定
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
BinBuffMain(BinIndex) = gHighASC
BinIndex = BinIndex + 1
End If
Next i
'メモリー確保
ReDim Preserve BinBuffMain(BinIndex - 1) As Byte
'ファイルナンバー取得
FileNum = FreeFile
'ファイル書き込み
Open dstFileName For Binary Access Write As #FileNum
Put #FileNum, 1, BinBuffMain()
Close #FileNum
NormExit:
SJisToEUC = True
Exit Function
ErrHandler:
Call MsgBox("エラーNo." & Err.Number & vbCrLf & vbCrLf & _
Err.Description, vbExclamation, "EUC -> S-JIS変換 - エラー")
End Function
はぁ、ちかれた。
|