- ベストアンサー
エンコード・デコードの仕方
インターネットのアドレス欄に良く見る %a4%db%a4%b2%a4%db%a4%b2+%a4%db%a4%cb%a4%e3%a4%e9%a4%e9%a1%c1 って感じのエンコード文字列ですが、 これはナニ形式と呼ぶのでしょうか? また、この文字列をデコードするにはどうしたらよいのでしょう? Excelマクロ(VBA)のなかでちょっと使ってみたいので、 どなたか、ご教示の程おねがいします。
- みんなの回答 (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
その他の回答 (2)
文字コードが分かっているのであれば、あとは自分が欲しい文字コードに変換するだけです。 文字コードの仕組みを解説したページを参考URLに記述しますので、読んでみてください。 記憶が正しければ、たしか変換方法も乗ってたと思ったんですが……。
お礼
早速Excelに分析ツール追加してみました。 む、難しい。
URL形式です。 デコードするには、まず「+」を「スペース」に置き換えます。 次に、%で始まる2文字を16進数と見なし、キャラクターコードに置き換えます。 その他の文字はそのままです。 ただし、エンコード前にどんな形式の文字列だったかという情報は、自動認識させるプログラムを書かないかぎり分かりません。 必ずしもシフトJISとは限らないので、変換してあげないといけない場合もあるのです。 今回の場合もシフトJISではなかったらしく、ただ変換しただけでは正しい文字列になりませんでした。 EUCで「ほげほげ ほにゃらら~」と書かれているようです。
お礼
ありがとう。 ちなみに例題はYahooの検索窓に打ち込み変換してました。 そのため、EUCになってしまいました。
補足
パターンから %a4%db → 0xA4DB ⇒ EUCの「ほ」 のようだということは気が付きました。 → の処理は何とかなりそうです。 ⇒ の変換処理はサッパリ判りません。 EUCしか扱わないことを前提として、 &hA4DBから「ほ」を出力する方法を アドバイス頂けますでしょうか?
お礼
おそくなってごめんなさいね。