• ベストアンサー

エンコード・デコードの仕方

インターネットのアドレス欄に良く見る %a4%db%a4%b2%a4%db%a4%b2+%a4%db%a4%cb%a4%e3%a4%e9%a4%e9%a1%c1 って感じのエンコード文字列ですが、 これはナニ形式と呼ぶのでしょうか? また、この文字列をデコードするにはどうしたらよいのでしょう? Excelマクロ(VBA)のなかでちょっと使ってみたいので、 どなたか、ご教示の程おねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.3

(゜▽゜*)♪ニパッ 個人的なロジック公開しちゃう バグあるかも? Sub Main()   MsgBox convUrltoUni("%a4%db%a4%b2%a4%db%a4%b2+%a4%db%a4%cb%a4%e3%a4%e9%a4%e9%a1%c1") End Sub Public Function convUrltoUni(inVal As String)   Dim lngLen   As Long   '文字長   Dim lngFindPos As Long   '%文字を見つけた位置   Dim lngStart  As Long   '検索開始位置   Dim strWk    As String  '文字列連結用ワーク   Dim blnHigh   As Boolean '文字列が全角か半角によって切り替わるフラグ   Dim bytWk    As Byte   '「%**」の値      Dim bytHigh   As Byte   '全角文字の時の上位バイト   Dim bytLow   As Byte   '全角文字の時の下位バイト   Dim bytChar1  As Byte   '変換ワーク上位   Dim bytChar2  As Byte   '変換ワーク下位      Dim eucCrLf   As Byte   'EUCの改行コード      'EUC改行コードを取得   eucCrLf = Asc(vbLf)      '文字長を得る   lngLen = Len(inVal)      '検索開始位置デフォルト   lngStart = 1      '上位バイトの処理を行ったことを記すフラグをおろす   blnHigh = False   Do     '%文字を見つける     lngFindPos = InStr(lngStart, inVal, "%")     '見つからなかったら、文字長+1をセット     If lngFindPos = 0 Then       lngFindPos = lngLen + 1     End If          '検索開始位置と「%」の発見位置が違うなら、半角文字が存在していることになる     If lngFindPos <> lngStart Then       '半角文字なので、そのままセット       strWk = strWk & Mid(inVal, lngStart, lngFindPos - lngStart)       blnHigh = False     End If          '「%」の発見位置が文字長を超えていたら抜ける     If lngFindPos >= lngLen Then       Exit Do     End If          'バイト値としてゲット     bytWk = CByte("&H" & (Mid(inVal, lngFindPos + 1, 2)))          '先に上位バイトの処理がなされていないなら     If Not blnHigh Then       '半角文字の時の処理       If bytWk < &H80 Then         '改行コードの処理         If bytWk = eucCrLf Then           strWk = strWk & vbCrLf         '改行コード以外の処理         Else           strWk = strWk + Chr(bytWk)         End If                '半角文字でないときの処理       Else         '下位バイトが必要なので、上位バイトとして値を記憶         bytHigh = bytWk - &H80         '変換準備上位(ここはお決まり変換ロジック)         If bytHigh < 95 Then           bytChar1 = 112         Else           bytChar1 = 176         End If                  '上位バイトの処理を行ったことを記すフラグを立てる         blnHigh = True       End If          'すでに上位バイトの処理がされている時     Else       '上位バイトと組み合わせての変換処理(ここはお決まり変換ロジック)       bytLow = bytWk - &H80       If bytHigh Mod 2 = 1 Then         If bytLow > 95 Then           bytChar2 = 32         Else           bytChar2 = 31         End If       Else         bytChar2 = 126       End If       bytHigh = ((bytHigh + 1) \ 2) + bytChar1       bytLow = bytLow + bytChar2              strWk = strWk & Chr(CInt("&H" & Hex(bytHigh) & Hex(bytLow)))              '上位バイトの処理を行ったことを記すフラグをおろす       blnHigh = False     End If          lngStart = lngFindPos + 3   Loop      convUrltoUni = strWk End Function

Passerby01
質問者

お礼

おそくなってごめんなさいね。

その他の回答 (2)

noname#25358
noname#25358
回答No.2

 文字コードが分かっているのであれば、あとは自分が欲しい文字コードに変換するだけです。  文字コードの仕組みを解説したページを参考URLに記述しますので、読んでみてください。  記憶が正しければ、たしか変換方法も乗ってたと思ったんですが……。

参考URL:
http://www.hosibune.net/~mak/technical/kanji.shtml
Passerby01
質問者

お礼

早速Excelに分析ツール追加してみました。 む、難しい。

noname#25358
noname#25358
回答No.1

 URL形式です。  デコードするには、まず「+」を「スペース」に置き換えます。  次に、%で始まる2文字を16進数と見なし、キャラクターコードに置き換えます。  その他の文字はそのままです。  ただし、エンコード前にどんな形式の文字列だったかという情報は、自動認識させるプログラムを書かないかぎり分かりません。  必ずしもシフトJISとは限らないので、変換してあげないといけない場合もあるのです。  今回の場合もシフトJISではなかったらしく、ただ変換しただけでは正しい文字列になりませんでした。  EUCで「ほげほげ ほにゃらら~」と書かれているようです。

Passerby01
質問者

お礼

ありがとう。 ちなみに例題はYahooの検索窓に打ち込み変換してました。 そのため、EUCになってしまいました。

Passerby01
質問者

補足

パターンから %a4%db → 0xA4DB ⇒ EUCの「ほ」 のようだということは気が付きました。 → の処理は何とかなりそうです。 ⇒ の変換処理はサッパリ判りません。   EUCしか扱わないことを前提として、   &hA4DBから「ほ」を出力する方法を   アドバイス頂けますでしょうか?