JISコードの表示ツールを作る

どうも、三流プログラマーのKen3です。 今回は、 漢字のJISコードの表示ツールを作ってみたいと思います。 プログラムは、 http://www.ken3.org/p/e/vbnet013.lzh に圧縮したプロジェクトが入ってます。 あわせて見てください。

/* * 1. 仕様を決める */

画面仕様 調査文字列 [ _______________ ] txtMOJI 結果 [ ____________________ ] txtOUT [ ____________________ ] 複数行可能とする 流れ ユーザーが確認したい文字列を入力後、調査開始のボタンを押します 文字列から1文字単位で文字を取り出し、コードを表示します。 オヤ?どこかで見たような?仕様だなぁ。 文字コードの表示で使ってた画面と一緒ですね。 txtMOJIと入力用にテキストボックスを作成して、 結果をtxtOUTに書き込むことにします。

/* * 2.下準備、調べごと */

漢字コード、JISコードの変換関数ないかなぁ、と調べ始める。 Asc関数をヘルプで見ると、返ってくるコードは、 解説 Asc は、入力文字に対するコード ポイント (文字コード) を返します。 2 バイト文字セット (DBCS: Double-Byte Character Set) 値に対しては -32768 〜 32767 です。 返される値は、TextInfo クラスの ANSICodePage プロパティに含まれている 現在のスレッドのコード ページによって異なります。 TextInfo.ANSICodePage は、 System.Globalization.CultureInfo.CurrentCulture.TextInfo.ANSICodePage を指定することによって取得できます。 なんかよくわかんないねぇ。 MsgBox(Hex(Asc(""))) で実際にテストしてみよう。 FFFF88A4?なにこれ? ( 実行画像) どうやら、シフトJISみたいですね、頭のFFFFは気になるけど、 88A4がシフトJISです。 とすると、シフトJISをJISに直す関数をチェックすると、 えっ無いの?(探し方が悪いのか?それとも漢字コードなんて気にしないのか?) シフトJIS JISコード 変換表 をキーワードにgoogleを検索する OSF 日本ベンダ協議会 (OSF/JVC) 推奨 日本語 EUC ・シフト JIS 間コード変換仕様とコード系実態調査 http://www.opengroup.or.jp/jvc/cde/sjis-euc.html 日経ソフトウエア JIS漢字コード http://software.nikkeibp.co.jp/software/special/jiscode/nc.html なんだか、よくわかんないよ(笑) オレは変換プログラムを書きたいんだってば、 *自分で変換の意味見て計算式ぐらい書けよ。  と読者の声が聞こえたところで、 初心者によるエンコーディングと文字セットメモ http://sanaki-web.hp.infoseek.co.jp/code/encode.htm を見ると、やっと変換の式が書いてある。 >S-JIS -> JIS >if(第一バイト <= 0x9F){ >第一バイト = 第一バイト - 0x71 >} >else{ >第一バイト = 第一バイト - 0xB1 >} >第一バイト = 2 * 第一バイト + 1 >if(第ニバイト > 0x7F){ >第ニバイト = 第ニバイト - 1 >} >if(第ニバイト >= 0x9E){ >第ニバイト = 第ニバイト - 0x7D >第一バイト = 第一バイト + 1 >} >else{ >第ニバイト = 第ニバイト - 0x1F >} を元に作成してみる。 'シフト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
あれ、Right関数にエラーのときの波線が入っているよ。 ( エラー画像) なんで?Right関数って無いの?と思い、ヘルプを見ると、 解説 Str の文字数を確認するには、Len 関数を使用します。 Windows フォーム、 または Right プロパティを持つほかの任意のクラスで使用される場合、 Microsoft.VisualBasic.Right で関数を完全修飾する必要があります。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^ えっ、そんなこと必要なの、、、 なんか、イヤだなぁ、、、 Private Sub btnRUN_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnRUN.Click Dim n As Integer 'カウンタ Dim strWORK As String '文字保存 Dim strCODE As String '文字コード16進 Me.txtOUT.Text = "" '結果エリアを初期化 For n = 1 To Me.txtMOJI.Text.Length '文字数分ループする strWORK = Me.txtMOJI.Text.Chars(n - 1) '配列が0からなので Me.txtOUT.Text += ("[" & strWORK & "] - ") strCODE = Microsoft.VisualBasic.Right(Hex(Asc(strWORK)), 4) If Len(strCODE) <= 2 Then '1バイト半角文字なら Me.txtOUT.Text += ("ASCII " & strCODE & "半角です") Else Me.txtOUT.Text += ("SJIS=" & strCODE) Me.txtOUT.Text += (" JIS=" & SJIStoJIS(strCODE)) End If Me.txtOUT.Text += vbCrLf '改行 Next End Sub と、してなんとか作ってみました。 こんなに一生懸命やらなくても、何かいいほうほうがありそうだけど。

/* * 3.終わりの挨拶 */

VB.Net風のやり方? よくわからなくて、すみません。 Microsoft.VisualBasic.Right(Hex(Asc(strWORK)), 4) これは、なんかガセネタって感じがするけど。。。 "Vb 仕様書"を変換すると、 [V] - ASCII 56半角です [b] - ASCII 62半角です [ ] - ASCII 20半角です [仕] - SJIS=8E64 JIS=3B45 [様] - SJIS=976C JIS=4D4D [書] - SJIS=8F91 JIS=3D71 と無事変換されました。 使えるツール作り、、、までの道のりは長そうです。 ループ処理や文字列操作の参考になれば幸いです。 気長に待てる人は、購読続けて下さい。 *解説、長くかかりそうなので。 プログラム作りは簡単で面白いなぁと感じるような 解説/メールマガジンを書きたいと思ってます。 よろしくお願いします。 AB型の変わり者、三流プログラマーのKen3でした。 -------------------------------------------------------------------------- 皆さまのご意見・ご感想・投稿、、毒舌、、どんどんお待ちしております。 今後やってほしい要望、説明してほしい関数などあったら、 (メールソフトで返信ボタンを押して送ってください) 指摘メールやご意見メール、 嫌いそうに見えて、実は好き(変わり者)なんで、どんどん、送ってください。 有料版なので、遠慮無く質問下さい。待ってます ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ このメールマガジンの解除は、 http://www.ken3.org/pmagmag/ からできます。(涙) 無料版でVBAの単体解説しているので、こちらも合わせて見てください。 三流君の書いてる無料版メルマガ http://www.ken3.org/vba/ VBA関係主にExcel/Access関数を少し http://www.ken3.org/asp/ ASP関係、Web上で少し遊んでます http://www.ken3.org/24h/ 元コンビニ店長だったので、コンビニの話を少し http://www.ken3.org/guchi/ 作者の貧しい心の中が見れる愚痴系 上記4つは無料なので試しに登録して見てください。 ~~~~~~~~~~~~~~~~~~~~ 総合案内のページは、 http://www.ken3.org/ がトップページとなってます。