読者様より↓フィードバック や ご意見
ADOを使用してEUC-JPのファイルをShift_JISに変換する http://frog.raindrop.jp/knowledge/archives/000051.html
↑ここを見てEUCを勉強してね・・・と言われた。ADOを使った簡単な方法があるんですね・・・※先に↑を見てください(合わせて読んでください)
<文字コードで遊ぶ SJISからEUC ヤフオクURLでチェック> こんにちは、三流プログラマーのKen3です。 ヤフーオークションのURL パラメータの部分を作ってみます。 ※p=%XX%XX の 部分を使って(作って)みます。 いつもの三流的なアプローチなので、実際はアレンジして使ってください。 ※一部でも参考になればいいんだけど・・・/* * 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コードの文字列を返す'SJISコードの文字列を受け取り、JISコードの文字列を返す
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'文字列を受け取り、バイト数を返す
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%> カタカナや英数だけだとつまらないので、 任天堂 をキーワードに 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 あとは、アレンジして有効活用していただければ、、、
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/* * 6.終わりの挨拶 </HTML> */
今回は、 EUCのコード変換にチャレンジしてみました。 ※と言っても、半角カナの変換はやらずに逃げたけど・・・ 三流プログラマーのサンプルですが、 何かの参考となれば幸いです。 ASP、VBScript勉強中の三流プログラマーのKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- ASP系の解説61 http://www.ken3.org/asp/backno/asp061.html SJIS--JISのコード変換
ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、
感想や質問・要望・苦情など 三流君へメッセージを送る。
下記のフォームからメッセージを送ることができます。
[三流君(TOP ken3.org へ戻る)]
/ [ASPで遊ぶ、失敗する]
/ [ASP記事 バックナンバー目次]
まぁ、基本はデータの受け取りかなぁ。
・[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記事 バックナンバー目次]