【】Top

【】VB.NET
【】VB6.0

【】メールマガジンの購読
【】メールマガジンの解除






【】会社概要

【】お問い合わせ


姉妹サイト「バーチャルコネクション!」はこちらです。

姉妹サイト「七福神のメールでビンゴ!」はこちらです。

アイネットマコト

●24時間365日の安心をあなたにAT-LINK専用サーバ・サービスお勧めのサーバです。






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

.NET では、EUCコードを Shift-JISコードに変換するといった
コード変換を行うことも可能です。
Webへアクセスして、ページソースを取得させることが可能です。



この機能を使えば、WebサイトなどでEUCで書かれたhtmソースを
Shift-JISに変換してソース表示して確認すると
いった事も可能です。


ここでは、簡単に、「URL」を指定してページソースを取得し、
EUCコードで書かれたページソースのデータを
Shift-JISコードに変換する場合での説明をしています。

フォームに次の様なコードを記述します


-----------VB.NETコーディングここから-------------------

1.フォームに、テキストボックスコントロールと
  ラベルコントロール、ボタンコントロールを配置します。
    下記は、デフォルトのオブジェクトの名前と配置を示しています。

  ┏━━━━┓   ┏━━━━┓
  ┃Labale1 ┃   ┃TextBox1┃
  ┗━━━━┛   ┗━━━━┛

           ┏━━━━┓
           ┃Button1 ┃
           ┗━━━━┛


  ┏━━━━┓   ┏━━━━┓
  ┃Labale2 ┃   ┃TextBox2┃
  ┗━━━━┛   ┃※複数行┃
                 ┃        ┃
                 ┗━━━━┛

  ┏━━━━┓   ┏━━━━┓
  ┃Labale3 ┃   ┃TextBox3┃
  ┗━━━━┛   ┃※複数行┃
                 ┃        ┃
                 ┗━━━━┛



2.テキストボックスコントロール TextBox2,TextBox3は、
    複数行の入力とするため、
    Multiline プロパティを True にします。(複数行)
    ScrollBars プロパティを Vertical にします。(スクロールバー)


3.配置したコントロールの
    ラベルのテキストを入力項目にあわせて変更します。
  さらに、ボタンコントロールのtext プロパティに
    「取得変換」と記述します。
  ※説明用のためです。必須ではありません。

  ┏━━━━┓   ┏━━━━┓
  ┃URL     ┃   ┃TextBox1┃
  ┗━━━━┛   ┗━━━━┛

           ┏━━━━┓
           ┃取得変換┃
           ┗━━━━┛


  ┏━━━━┓   ┏━━━━┓
  ┃変換前  ┃   ┃TextBox2┃
  ┗━━━━┛   ┃※複数行┃
                 ┃        ┃
                 ┗━━━━┛

  ┏━━━━┓   ┏━━━━┓
  ┃変換後  ┃   ┃TextBox3┃
  ┗━━━━┛   ┃※複数行┃
                 ┃        ┃
                 ┗━━━━┛







4.ボタンコントロールをダブルクリックして、
    ボタンのクリックイベントの編集を開始して、
    フォームの宣言部に、次のコードを記述します。

    Imports System
    Imports System.Text
    Imports System.Net


  さらに、次のコードを記述します。


    Private Sub Button1_Click(ByVal sender As System.Object, _
       ByVal e As System.EventArgs) Handles Button1.Click

        Dim strUrl As String 'URL

        Dim myWebClient As New WebClient    'Web
        Dim myDatabuffer() As Byte          'バッファバイト配列
        Dim myDatabufferCov() As Byte       'バッファバイト配列

        Dim strHtml As String

        Try


            'URLをセットします
            strUrl = TextBox1.Text

            'URLからデータを取り出します
            myDatabuffer = myWebClient.DownloadData(strUrl)
            'エンコードしています
            strHtml = Encoding.Default.GetString(myDatabuffer)

            'ページソースを表示しています
            TextBox2.Text = strHtml

            myDatabufferCov = COV_EUCTOSJIS3(myDatabuffer)


        Catch webEx As WebException
            'エラー
            TextBox2.Text = webEx.ToString()

        End Try




        TextBox3.Text = Encoding.Default.GetString(myDatabufferCov)

    End Sub


    'コード変換
    'EUC→Shify-JIS アイネットマコト
    Function COV_EUCTOSJIS3(ByVal PistrCOV() As Byte) As Byte()


        Dim bytBytes() As Byte    'バイト配列
        Dim Cov_SJis As Encoding = Encoding.GetEncoding("Shift_JIS")
        bytBytes = PistrCOV

        Dim strSrcE As String    '変換した文字列


        Dim bytRec() As Byte
        Dim bytWRec() As Byte
        Dim bytW2Rec() As Byte

        Dim lngLenC As Long
        Dim LngLenMax As Long
        Dim lngStep As Long
        Dim lngWStep As Long
        Dim lngWLenC As Long
        Dim lngWStepMax As Long

        Dim lngCount As Long

        Dim intFlg As Integer



        Const LC_BYTE = 65048


        LngLenMax = bytBytes.LongLength
        lngLenC = 1
        lngWLenC = 1
        lngStep = LC_BYTE
        intFlg = 0
        ReDim bytRec(lngStep)



        Do
            If lngLenC + lngStep > LngLenMax Then
                lngStep = LngLenMax - lngLenC
                ReDim bytRec(lngStep)
            End If

            bytRec = bytBytes

            '改行コードを変換します
            lngCount = -1
            lngWStep = -1
            ReDim bytWRec(0)
            Do
                lngCount = lngCount + 1
                lngWStep = lngWStep + 1
                If lngCount > lngStep Then
                    Exit Do
                End If

                'EUCコードの範囲をチェック
                If (bytRec(lngCount) >= &HA1 And _
                    bytRec(lngCount) <= &HFE) Or intFlg = 1 Then
                    '第1バイトが、0xA1〜0xFE の範囲であることが、
                    '第一条件
                    '取り出したバイトをオーバーしたら処理を終える
                    If lngCount + 1 > lngStep Then
                        ReDim Preserve bytWRec(lngWStep)
                        bytWRec(lngWStep) = bytRec(lngCount)
                    Else


                        '第1バイトをチェックして、
                        '奇数か偶数かを判定する。
                        '偶数の場合は、必ずあまりは0
                        If bytRec(lngCount) Mod &H2 = 0 Then
                            '偶数の場合は、第2バイトは、
                            '0x02 マイナスした値
                            bytRec(lngCount + 1) = _
                            bytRec(lngCount + 1) - &H2

                        Else
                            '奇数の場合は、第2バイトは、
                            '0x60 マイナスした値
                            'ただし、変換後、0x7Eをこえる場合は、
                            '0x61 マイナスした値
                            'つまり、変換後、0x7Eをこえる場合は、
                            'さらに 0x01マイナスすることとなる

                            If (bytRec(lngCount + 1) _
                                - &H61) < &H40 Then
                                bytRec(lngCount + 1) = _
                                bytRec(lngCount + 1) + &H9
                            Else
                                bytRec(lngCount + 1) = _
                                bytRec(lngCount + 1) - &H61


                                '第2バイトをチェック
                                If bytRec(lngCount + 1) > &H7E Then
                                    bytRec(lngCount + 1) = _
                                    bytRec(lngCount + 1) + &H1
                                End If

                            End If




                        End If

                        '第2バイトをチェック
                        If bytRec(lngCount + 1) = &H7F Then
                            bytRec(lngCount + 1) = _
                            bytRec(lngCount + 1) + &H63
                        End If


                        '第1バイトの変換
                        '0xDFより値が小さい場合は、プラス 0x30
                        'それ以外の場合は、プラス 0x70 する
                        '第1バイトをチェック
                        If bytRec(lngCount) < &HDF Then
                            bytRec(lngCount) = _
                            bytRec(lngCount) + &H1
                            bytRec(lngCount) = _
                            Int(bytRec(lngCount) / &H2)
                            bytRec(lngCount) = _
                            bytRec(lngCount) + &H30
                        Else
                            bytRec(lngCount) = _
                            bytRec(lngCount) + &H1
                            bytRec(lngCount) = _
                            Int(bytRec(lngCount) / &H2)
                            bytRec(lngCount) = _
                            bytRec(lngCount) + &H70
                        End If


                        ReDim Preserve bytWRec(lngWStep)
                        bytWRec(lngWStep) = bytRec(lngCount)

                        '2バイト書き出したので、スキップします。
                        lngCount = lngCount + 1
                        lngWStep = lngWStep + 1

                        ReDim Preserve bytWRec(lngWStep)
                        bytWRec(lngWStep) = bytRec(lngCount)




                    End If

                Else
                    '範囲外なのでそのまま書き出します。

                    ReDim Preserve bytWRec(lngWStep)
                    bytWRec(lngWStep) = bytRec(lngCount)

                End If

            Loop

            lngLenC = lngLenC + lngStep
            lngWLenC = lngWLenC + lngWStep
            If lngLenC >= LngLenMax Then
                Exit Do
            End If
        Loop

        COV_EUCTOSJIS3 = bytWRec

    End Function








5.ビルドして実行します。

6.フォームに表示された
    「URL」欄に、取得したいURLを入力します。
     ※EUC で書かれたWebサイトをしてください。
     ※例) http://yahoo.co.jp/

7.フォームに表示された「取得変換」を押すと、
    「変換前」欄に、ページソースが表示されます。
    「変換後」欄に、Shift-JISに変換したページソースが表示されます。



-----------VB.NETコーディングここまで-------------------


EUCで書かれたページの内容をそのままの状態では、
確認が出来ませんが、本サンプルのように、コード変換することで、
容易に確認が出来るようになります。


また、本サンプルは一旦ファイルに落として、FilePutによるI/Oを
行って、変換を行っています。







 

http://anetm.com/dev/d.cgi?SC=DTDTL&o=Ol/

Copyright(c)2001-2004 Ai Net Makoto 記事・情報の無断転載を禁止します。

「これがほしかった!厳選サンプルツール集」の注意点
●当サイトはリンクフリーです。
2005/10/06(木)00:05 更新