[三流君] −−> [ASPで遊ぶ、失敗する] −−> [バックナンバー一覧]

文字コードで遊ぶ SJISからEUC ヤフオクURLでチェック


本文(発行内容)


<文字コードで遊ぶ SJISからEUC ヤフオクURLでチェック> 

こんにちは、三流プログラマーのKen3です。

ヤフーオークションのURL パラメータの部分を作ってみます。
※p=%XX%XX の 部分を使って(作って)みます。

いつもの三流的なアプローチなので、実際はアレンジして使ってください。
※一部でも参考になればいいんだけど・・・

読者様より↓フィードバック や ご意見 ADOを使用してEUC-JPのファイルをShift_JISに変換する http://frog.raindrop.jp/knowledge/archives/000051.html ↑ここを見てEUCを勉強してね・・・と言われた。ADOを使った簡単な方法があるんですね・・・※先に↑を見てください(合わせて読んでください)

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

隣のVBA系に来た質問なんだけど、 ---- >「No.167 amazonの広告コード UTF-8を探る(keywordを作る) 」を >ヤフーのオークション検索に使おうと、 >そのままACCESS2000のVBAにコピペしたのですが、 >ヤフーオークションの検索はUTF−8ではないのでしょうか、 >文字化けしてしまいます。 ---- と質問をもらう。

/* * 2.現象や現在の状態を確認する */

謎を解くには、現場100回じゃなかった現状の確認から。 ヤフーオークションで実際に、 ニンテンドーDS を検索してみます。 (処理イメージ http://ken3-info.blog.ocn.ne.jp/screen/2007/05/ds_1a7e.html ) すると、下記のようなURLが作成されます。 http://search.auctions.yahoo.co.jp/jp/search/auc?p=%A5%CB%A5%F3%A5%C6%A5%F3%A5%C9%A1%BCDS&auccat=0&alocale=0jp&acc=jp パラメーターを見ると、P=が検索文字っぽいので、 p=%A5%CB%A5%F3%A5%C6%A5%F3%A5%C9%A1%BCDS 後ろの半角DSはそのまま送っているみたいなので、 ニンテンドー が、 %A5%CB%A5%F3%A5%C6%A5%F3%A5%C9%A1%BC かな。 ニンテンドーは6文字なので、 ニ %A5%CB ン %A5%F3 テ %A5%C6 ン %A5%F3 ド %A5%C9 ー %A1%BC カタカナだったので、少々不安ですが、 ※私の作った例がよくなかった・・・(笑) ASP系の解説61で、 http://www.ken3.org/asp/backno/asp061.html SJIS--JISのコード変換 を書いてます。ここでニンテンドーを変換してみます。 ↓テストの変換プログラム http://www.ken3.org/cgi-bin/test/test061-1.asp?DATA=%83j%83%93%83e%83%93%83h%81%5B ニンテンドーをJISとシフトJISに変換すると、 受け取ったデータは[ニンテンドー]です バイト数は、12Byteです [ニ] をAscで変換すると-31894 さらにHexで16進(SJIS)は836A JISコードは254B [ン] をAscで変換すると-31853 さらにHexで16進(SJIS)は8393 JISコードは2573 [テ] をAscで変換すると-31899 さらにHexで16進(SJIS)は8365 JISコードは2546 [ン] をAscで変換すると-31853 さらにHexで16進(SJIS)は8393 JISコードは2573 [ド] をAscで変換すると-31896 さらにHexで16進(SJIS)は8368 JISコードは2549 [ー] をAscで変換すると-32421 さらにHexで16進(SJIS)は815B JISコードは213C あれ?違った・・・ 質問にあった、UTF-8 でも無く シフトJIS や JIS でもないのかぁ・・・ う〜ん、困った。(※困ったから、新しいネタを発行できたんだけどね)

/* * 3.漢字コードってどんなのあるの? */

三流プログラマーの前に日本人プログラマーだから、 漢字コード系は避けて通れないのかなぁ・・・ う〜ん、 IEのメニュー 表示 の エンコードを見ると、 通常自動になっていると思うのですが、 ・UFT-8 ・EUC ・シフトJIS なんて項目があるみたいです。 処理イメージ↓ http://ken3-info.blog.ocn.ne.jp/screen/2007/05/post_afad.html

/* * 4.資料を見つけ やっと動き出す */

EUCコードってヤツがまだ試していないので、 いつものように わからなかったら google/Yahoo で検索してみます。 キーワードは SJIS EUC 漢字変換 の3つのキーワードで探してみます。 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLJ,GGLJ:2006-35,GGLJ:ja&q=SJIS+EUC+%e6%bc%a2%e5%ad%97%e5%a4%89%e6%8f%9b (※EUCだけだとかなりの数出てくるのでSJISと変換を追加) 調べると、 JIS, EUC, SJIS の漢字コードについて http://www.unixuser.org/~euske/doc/kanjicode/index.html や JIS X 0213 FAQ http://seclan.dll.jp/ccjx0213.htm なんて感じの解説サイトが見つかります。 先人たちの記録に感謝ですね。 こんな感じで、なんか調べられそうな予感がしたり。

/* * 5.JISコードの 最上位ビットを立て EUCにする? */

JISの頭のビットを立てたEUCコードなんてのがあります。 [ニ] JISコードは254B なのですが、 この 25 と 4B 頭のビットを立てると、 ニ %A5%CB になります。 頭のビットを立てる?な感じですが、簡単な方法は、 or &h80 と論理演算をするのが楽かなぁ? SJISからJISの変換後に or &H80 としてみます。 ※+&H80でもOKかなぁ? ↓元々あったJIS変換ルーチンに組み込んで作ってみました。 http://www.ken3.org/cgi-bin/test/test107-1.asp?DATA=%83j%83%93%83e%83%93%83h%81%5B+DS <%@LANGUAGE=VBScript%> <html> <head> <title>SJISからEUCに変換、文字コード関係で遊ぶ</title> </head> <body> <h2>SJISからEUCコードに変換、文字コード関係で遊ぶ</h2> と言っても、JISのコードの頭を0x80でビットを立ててるだけなのですが。<br> <br> 自作したSJIS--EUC変換ルーチンを呼んでます。<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) & "] " strCODE = Hex(Asc(strWORK)) If Len(strCODE) <= 2 Then '半角か? Response.Write " 半角はそのまま16進数にする " & strCODE Else Response.Write " さらにHexで16進(SJIS)は" & strCODE Response.Write " JISは" & SJIStoJIS(strCODE) Response.Write " EUCは" & SJIStoEUC(strCODE) End If Response.Write "<BR>" & vbCRLF Next 'ヤフーオークションのリンクを作ってみる。 p="" 'パラメータ文字列の初期化。 For n = 1 To Len(CHK_DATA) strWORK = Mid(CHK_DATA, n, 1) 'n番目の文字を取り出す strCODE = Hex(Asc(strWORK)) If Len(strCODE) <= 2 Then '半角か? If strWORK = " " Then '半角スペースは+に変換する p = p & "+" 'ほかにも特殊文字があるんだけど手抜き Else p = p & strWORK '半角はそのまま追加する ヤフオクの場合 End If Else sEUC = SJIStoEUC(strCODE) 'EUCコードに変換する。 '%付きの文字列 %XX%XX を作成する。 p = p & "%" & Mid(sEUC,1,2) & "%" & Mid(sEUC,3,2) End If Next ' A リンクを表示する。 sURL = "http://search.auctions.yahoo.co.jp/jp/search/auc?" sURL = sURL & "p=" & p '変数pを追加 sURL = sURL & "&auccat=0&alocale=0jp&acc=jp" '追加パラメータ Response.Write "<a Href='" & sURL & "' target='_blank'>" Response.Write Server.HTMLEncode(CHK_DATA) & "</a>← ヤフオクに飛ぶ<br>" Response.Write "↑キーワードリンク リンクのコードは↓<br>" Response.Write Server.HTMLEncode(sURL) & "<br>" End If %> <HR> <FORM ACTION="test107-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コードの文字列を受け取り、EUCコードの文字列を返す
Function SJIStoEUC(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

    'JISの hi と lo ができたので、0x80 を or して 最上位のビットを立てます。
    hi = hi or &h80
    lo = lo or &h80

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

End Function
'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/test107-1.asp?DATA=%94C%93V%93%B0 ↑こんな感じでやってみました。 任天堂 Wii ↓ http://www.ken3.org/cgi-bin/test/test107-1.asp?DATA=%94C%93V%93%B0+Wii あとは、アレンジして有効活用していただければ、、、

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

今回は、 EUCのコード変換にチャレンジしてみました。 ※と言っても、半角カナの変換はやらずに逃げたけど・・・ 三流プログラマーのサンプルですが、 何かの参考となれば幸いです。 ASP、VBScript勉強中の三流プログラマーのKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- ASP系の解説61 http://www.ken3.org/asp/backno/asp061.html SJIS--JISのコード変換

フィードバック

ASP系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.107を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります

三流君の主なリンク先

[アクセスランキング] [サイトマップ] [リンク先・相互リンク先など]
ASPで遊ぶ、失敗する 掲示板 バックナンバー
三流プログラマー 業務の愚痴 掲示板 バックナンバー
VBAで楽しくプログラミング 掲示板 バックナンバー
コンビニのオモテとウラ話 掲示板 バックナンバー
www.ken3.org(サイト内)から Google を利用して、

その他 宣伝広告