CodingFirst

C言語、Perl、JavaScript、最近はPythonも。出来上がったものより、プログラムを書くことが好き。あと、スイーツ。

スポンサーサイト

  • このエントリーをはてなブックマークに追加
  • web拍手 by FC2
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

JavaScriptでURLをちょっと賢く解読する。

  • このエントリーをはてなブックマークに追加
  • web拍手 by FC2

ちょっと賢くURLデコードする。UTF-8限定だけど。

Googleの検索結果とかでURLに %E3%81%AD%E3%81%8E などと、
%xxな文字列になっている事があるが、

URIの規則を定める RFC 3986 では、URIにASCIIの非予約文字[1]以外の文字データを用いる場合には、「%xx」(xxは16進数)という形でコードを表記することが定められている。
URLエンコード - Wikipedia
という事で、JavaScriptで元の文字に戻すには、decodeURIすればいい。

decodeURI('%E3%81%AD%E3%81%8E'); //=>'ねぎ'

でもエラーに弱くて、例えば、

decodeURI('%E3%81%AD%E3%81%8E%E5%A4%A7%E7%9B%9B%E3%82');
  //=>'URIError: URI malformed'

例外が起きて変換できない。最後の %E3%82 の後に1個足りないせい。
そこだけ除いてデコードするっきゃない。
正規表現で有効なデータを抜き出して decodeURIすりゃいい。

var utf8uri = new RegExp(
   "%[0-7][0-9A-F]|"+
   "%C[2-9A-F]%[89AB][0-9A-F]|%D[0-9A-F]%[89AB][0-9A-F]|"+
   "%E[0-F](?:%[89AB][0-9A-F]){2}|"+
   "%F[0-7](?:%[89AB][0-9A-F]){3}|"+
   "%F[89AB](?:%[89AB][0-9A-F]){4}|"+
   "%F[CD](?:%[89AB][0-9A-F]){5}","ig");
s=s.replace(utf8uri,function(whole){
  return decodeURI(whole);
});

UTF-8のURIエンコードだけにマッチングする正規表現にしてみた。

UTF-8っておもしろいコードしてるな!!
1~6バイトの可変長で、1バイト目でバイト数が分かるようになってて、
1バイト目かどうかを識別できるのがいい!
ASCIIコードと上位互換してるってのも気配りできてる感じでいい。

さてと、急に話は変わるけど、
URIエンコードされた文字列みてると、たまに %25E3%2581 とか
%25 がやたらでてくる場合があるんだけど、%25って % の事。
つまり、2回 encodeURI()したってこと。
更に、何度も何度も encodeURIされてて、
%25252525E3
とかニコニコ成長してく(笑)。

これも正規表現使ってさくっと変換してみよう~。

s=s.replace(/%(?:25)+([0-9A-F][0-9A-F])/g,function(whole,m1){
  return "%"+m1;
});

うん。満足。
正規表現って便利だな。はまる人が多いのもわかる気がする。

さてさて、
両方足したデコードできるサンプルを↓に置いてみた。


↑のソースはgistに置いた。

UTF-8も面白かったけど、やっぱ正規表現

正規表現はプログラマにとって必修科目と思うんだけど、
以外にさっぱり分からんって人が多いんだよな。。

まぁ、人の事はいいとして、正規表現は複数の言語を渡り歩くためにも、
熟考しといたほうがいいんだけど、まだ、読めてないんだよなぁ↓の本。


詳説 正規表現 第3版詳説 正規表現 第3版
(2008/04/26)
Jeffrey E.F. Friedl

商品詳細を見る

つい、クックブックとかに手を出しそうになる。


正規表現クックブック正規表現クックブック
(2010/04/15)
Jan Goyvaerts、Steven Levithan 他

商品詳細を見る

あと、文字コードはこの本がいいって聞いたことあったな。


プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)
(2010/02/18)
矢野 啓介

商品詳細を見る
スポンサーサイト


★☆★コメント★☆★

コメントの投稿

Name
Subject
Mail
URI
Comment
Pass
Secret 管理者にだけ表示を許可する

トラックバック

http://iyukki.blog56.fc2.com/tb.php/120-74d31eef

 | HOME | 

Search

Recent Entries

Foot Print



Categories

Monthly

Recent Comments

Recent Trackbacks

Profile

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。