プロが教える店舗&オフィスのセキュリティ対策術

インターネットのアドレス欄に良く見る
%a4%db%a4%b2%a4%db%a4%b2+%a4%db%a4%cb%a4%e3%a4%e9%a4%e9%a1%c1
って感じのエンコード文字列ですが、
これはナニ形式と呼ぶのでしょうか?

また、この文字列をデコードするにはどうしたらよいのでしょう?

Excelマクロ(VBA)のなかでちょっと使ってみたいので、
どなたか、ご教示の程おねがいします。

A 回答 (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
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/12/02 00:30

 文字コードが分かっているのであれば、あとは自分が欲しい文字コードに変換するだけです。



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

参考URL:http://www.hosibune.net/~mak/technical/kanji.shtml
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/11/08 23:21

 URL形式です。



 デコードするには、まず「+」を「スペース」に置き換えます。
 次に、%で始まる2文字を16進数と見なし、キャラクターコードに置き換えます。
 その他の文字はそのままです。

 ただし、エンコード前にどんな形式の文字列だったかという情報は、自動認識させるプログラムを書かないかぎり分かりません。
 必ずしもシフトJISとは限らないので、変換してあげないといけない場合もあるのです。

 今回の場合もシフトJISではなかったらしく、ただ変換しただけでは正しい文字列になりませんでした。
 EUCで「ほげほげ ほにゃらら~」と書かれているようです。

この回答への補足

パターンから
%a4%db → 0xA4DB ⇒ EUCの「ほ」
のようだということは気が付きました。

→ の処理は何とかなりそうです。

⇒ の変換処理はサッパリ判りません。
  EUCしか扱わないことを前提として、
  &hA4DBから「ほ」を出力する方法を
  アドバイス頂けますでしょうか?

補足日時:2002/10/31 19:33
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/11/08 23:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!