[三流君] −−> [ASPで遊ぶ、失敗する] −−> [バックナンバー一覧]
−−> No.061 SJIS--JISのコード変換

SJIS--JISのコード変換



本文(発行内容)


<SJIS--JISのコード変換>

こんにちは、三流プログラマーのKen3です。 今回は、 シフトJISからJISコードへ、コード変換を行ってみます。 拾い読みして、何かの参考となれば幸いです。

/* * 1.今回のキッカケ */

VBA系のメルマガ( http://www.ken3.org/vba/ ) で、 シフトJISからJISコードへ、コード変換を行ってみたので、 ASP(VBScript)でもやってみます。

/* * 2.VBAの自作関数を移植する。 */

VBA系のメルマガ No.79 SJIS--JISコードの文字列を作成したい で、下記の変換関数を作成しました。 ※式、コードの意味などは、 http://www.ken3.org/backno/backno_vba16.html#79 を見てください。 'シフトJISコードの文字列を受け取り、JISコードを返す
Function SJIStoJIS(strSJISCODE As String) As String

    Dim hi As Long
    Dim lo As Long

    'シフトJISコードの上位バイトを hi、下位バイトを lo とします。
    hi = Val("&h" & Mid(strSJISCODE, 1, 2))
    lo = Val("&h" & Mid(strSJISCODE, 3, 2))

    'hi が 0x9f 以下の場合、 hi から 0x71 減じます。
    'そうでない場合、 hi から 0xB1 減じます。
    hi = hi - IIf(hi <= &H9F, &H71, &HB1)
    
    'hi に 2 を乗じて、さらに 1 を加えます。
    hi = hi * 2 + 1
    
    'lo が 0x7F より大きい場合、 lo から 1 減じます。
    If lo > &H7F Then lo = lo - 1
    
    'lo が 0x9E 以上の場合、lo から 0x7D 減じて、hi に 1 加えます。
    If lo >= &H9E Then
        lo = lo - &H7D
        hi = hi + 1
    Else 'そうでない場合、 lo から 0x1F 減じます。
        lo = lo - &H1F
    End If

    '結果を返します
    SJIStoJIS = Right("0" & Hex(hi), 2) & Right("0" & Hex(lo), 2)

End Function
まぁ、VBScriptでも、普通に動くだろ、 変数やりターン値の AS XXXXX の型指定が出来ないから、それは取って 組み込み実行すると。 Microsoft VBScript 実行時エラー エラー '800a000d' 型が一致しません。: 'Val' /cgi-bin/test/test061-1.asp, 行 61 オイオイ、Val関数って使えないのかよ。 ※いつも思うけど、  型が一致しないとメッセージでるから、送り側の変数が悪いのか?  と見当違いのデバックしてたよ。  型が一致しません。じゃなくて、関数が見つかりませんのほうがいいのにね。 'シフトJISコードの上位バイトを hi、下位バイトを lo とします。 hi = Clng("&h" & Mid(strSJISCODE, 1, 2)) lo = Clng("&h" & Mid(strSJISCODE, 3, 2)) と Clng関数を使用に変更しました。 えっ、まだダメなの? Microsoft VBScript 実行時エラー エラー '800a000d' 型が一致しません。: 'IIf' /cgi-bin/test/test061-1.asp, 行 66 あらら、IIfもVBScriptは無いんだぁ。 一行で書いてる処理をバラすか。 If hi <= &H9F Then hi = hi - &H71 'hi が 0x9f 以下の場合、 hi から 0x71 減じます。 Else hi = hi - &HB1 'そうでない場合、 hi から 0xB1 減じます。 End If と 普通に書きました(笑)

/* * 3.テストモジュールを組み込む */

http://www.ken3.org/cgi-bin/test/test061-1.asp?DATA=Ken3%82%CD%8EO%97%AC でテストすると、 受け取ったデータは[Ken3は三流]です バイト数は、10Byteです 1文字目は[K] をAscで変換すると75 さらにHexで16進数にすると4B 2文字目は[e] をAscで変換すると101 さらにHexで16進数にすると65 3文字目は[n] をAscで変換すると110 さらにHexで16進数にすると6E 4文字目は[3] をAscで変換すると51 さらにHexで16進数にすると33 5文字目は[は]をAscで変換すると-32051さらにHexで16進(SJIS)は82CD JISコードは244F 6文字目は[三]をAscで変換すると-29105さらにHexで16進(SJIS)は8E4F JISコードは3B30 7文字目は[流]をAscで変換すると-26708さらにHexで16進(SJIS)は97AC JISコードは4E2E 使用したテストモジュールは、 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <%@LANGUAGE=VBScript%> <html> <head> <title>SJISからJISコードに変換、文字コード関係で遊ぶ</title> </head> <body> <h2>SJISからJISコードに変換、文字コード関係で遊ぶ</h2> <br> 自作したSJIS--JIS変換ルーチンを呼んでます。<br> ※詳細は、ソースと詳細解説のページを見てください。<br> <hr> <% CHK_DATA = Request.QueryString("DATA") 'パラメータの代入 '長さをチェックする If Len(CHK_DATA) <> 0 Then '文字が入っていたら Response.Write "受け取ったデータは[" Response.Write Server.HTMLEncode(CHK_DATA) & "]です<br>" '関数を呼んで、バイト数を表示する Response.Write "バイト数は、" & Byte_Count(CHK_DATA) & "Byteです<br>" '文字数分ループして、コードを表示 For n = 1 To Len(CHK_DATA) Response.Write n & "文字目は" strWORK = Mid(CHK_DATA, n, 1) 'n番目の文字を取り出す Response.Write "[" & Server.HTMLEncode(strWORK) & "] " Response.Write "をAscで変換すると" & Asc(strWORK) strCODE = Hex(Asc(strWORK)) If Len(strCODE) <= 2 Then '半角か? Response.Write " さらにHexで16進数にすると" & strCODE Else Response.Write " さらにHexで16進(SJIS)は" & strCODE Response.Write " JISコードは" & SJIStoJIS(strCODE) End If Response.Write "<BR>" & vbCRLF Next End If %> <HR> <FORM ACTION="test061-1.asp" METHOD="GET"> 調査したい文字列を入力してください。<br> <INPUT TYPE="text" SIZE="30" NAME="DATA" VALUE="<%=CHK_DATA%>"> <INPUT TYPE="submit" VALUE="コード調査開始"><br> ↑いろいろと遊んでみてください↑ </FORM> <br> </body> </html> <% 'SJISコードの文字列を受け取り、JISコードの文字列を返す
Function SJIStoJIS(strSJISCODE)

    Dim hi 
    Dim lo 

    'シフトJISコードの上位バイトを hi、下位バイトを lo とします。
    hi = Clng("&h" & Mid(strSJISCODE, 1, 2))
    lo = Clng("&h" & Mid(strSJISCODE, 3, 2))

    If hi <= &H9F Then 
      hi = hi - &H71 'hi が 0x9f 以下の場合、 hi から 0x71 減じます。
    Else
      hi = hi - &HB1 'そうでない場合、 hi から 0xB1 減じます。
    End If

    'hi に 2 を乗じて、さらに 1 を加えます。
    hi = hi * 2 + 1

    'lo が 0x7F より大きい場合、 lo から 1 減じます。
    If lo > &H7F Then lo = lo - 1

    'lo が 0x9E 以上の場合、lo から 0x7D 減じて、hi に 1 加えます。
    If lo >= &H9E Then
        lo = lo - &H7D
        hi = hi + 1
    Else 'そうでない場合、 lo から 0x1F 減じます。
        lo = lo - &H1F
    End If

    '結果を返します
    SJIStoJIS = Right("0" & Hex(hi), 2) & Right("0" & Hex(lo), 2)

End Function
'文字列を受け取り、バイト数を返す
Function Byte_Count(strMOJI)
  bcnt = 0
  '文字数分ループして、コードを表示
  For n = 1 To Len(strMOJI)
    nCODE = Asc(Mid(strMOJI, n, 1))  'n番目の文字コードを求める
    If (nCODE And &HFF00) = 0 Then  'コードは1バイトか? *asp055
      bcnt = bcnt + 1
    Else
      bcnt = bcnt + 2
    End If
  Next
  'リターン値をセットする
  Byte_Count = bcnt
End Function
%>
http://www.ken3.org/cgi-bin/test/test061-1.asp でいろいろな文字を入れて、遊んでみてください。

/* * 4.終わりの挨拶 </HTML> */

今回は、 ・VBAで作成したJISコードの変換モジュールを移植してみました。 ・Val関数は使えない ・IIf関数は使えない って話でした 何かの参考となれば幸いです。 ASP、VBScript勉強中の三流プログラマーのKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- VBA系のメルマガ No.79 SJIS--JISコードの文字列を作成したい http://www.ken3.org/backno/backno_vba16.html#79 変換の式、調査方法などを見てください。


ページフッター

ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、

三流君へ メッセージを送る

感想や質問・要望・苦情など 三流君へメッセージを送る。
返信例 XXXXさんへ
下記のフォームからメッセージを送ることができます。


あなたのお名前(ニックネーム):さん
返信は?:

アドレス:に返事をもらいたい
感想や質問↓:


(感想や質問・要望・苦情はHPで記事に載せることがあります。)

種類別のリンク や 広告など

[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]


Blogとリンク:[三流君のMemo別館]/ [ASP 三流君のソースコード置き場]/ [Ken3Video YouTubeで動画解説]
広告:

気になった ジャンル ↓を選択してください。

まぁ、基本はデータの受け取りかなぁ。
・[Form等を使用したデータのやり取り]・・・ASPと言っても、HTMLの入力フォームからデータを受け取ります。POSTやGETでやりとりを押さえますか。

次は、データの入出力 で ADOを使った(ADOで接続) と SQLの解説を少々
・[ADOでMdbファイルを使う]・・・MDBと接続して、簡単な追加・更新・削除を行った。
・[ADOでExcelと接続してみた]・・・.xlsと接続してSQLを使ってみた。
・[ADOでCSVと接続してみた]・・・.CSV テキストを読み出した。※更新・削除はできません

広告:



DBが使えるので、あまり使用しないけど、普通のテキストファイル処理
・[テキストファイル処理]・・・ファイルを開いて、書き込む。1行読み込みなどを軽く

VBScriptでFormat関数が無いなど、微妙にVBAと違うけど
[VBScript関数関係の説明]・・・少し、処理を書いてみた。
[その他処理サンプル]・・・あまり良いサンプル作れなかったけど。。。
何かの参考となれば幸いです。



[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]


広告: