[三流君] −−>
[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系の→[掲示板]←を覗く、質問を書き込む
評価・感想
三流君の主なリンク先
[アクセスランキング]
[サイトマップ]
[リンク先・相互リンク先など]
その他 宣伝広告