● S-JISコードをEUCコードに変換する ●

コード表は載せないよ。だって、テーブル作るのめんどっちィんだもん。

さて、今度もめんどくさい処理が目白押しだよ。

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

はぁ、ちかれた。


戻る