INFOINFO
MAILMAIL

2007年 9月10日(月)

* PHP: Javascriptのescapeに対応したunescape関数のバグ    [  PHP  ]

 先日オープンしたサブサイト用にMT用の投稿ページをつくるときに、JavascriptのBookmarkletからデータを取り込めるようにするために利用したのが「unescape(PHP)関数 Javascript版escape日本語POST対応」で紹介されているunescape関数。
 このページでも紹介されているけど、Javascriptから特定のページにデータを渡す際にはescape関数でエンコードして渡すのが一般的なんだけど、PHPではこれでエンコードされた文字列をデコードする手段がデフォルトでは用意されてないわけだ。でも、まぁ、そういうのは時間が解決してくれるわけで(笑)、どこかの偉いエンジニアがデコードできる関数を作ってくれて公開されているというわけ。すごいなぁ、偉いなぁ(^^)。

 んなわけで、ウチでもそれを使ってるんだけど、ここ最近、何故かうまく文字列が取り込めないパターンが2〜3度あったわけ。で、いろいろ調べてみると、特定の文字があるとこのunescape関数でうまく戻せなくなってると。確認したところでは、文字列に“−”(ダッシュ)が含まれると、それ以降が抜けるらしい。
 で、この関数、データをデコードした後で指定した文字コードに変換してるんだけど、この変換にiconvを使ってて、どうもここがうまくない感じ。結局、この変換部分をmb_convert_encodingにおきかえると問題なくなった。結局、

if ($iconv_to != "UTF-8") {
    $decodedStr = iconv("UTF-8", $iconv_to, $decodedStr);
}

という部分を、
if ($iconv_to != "UTF-8") {
    $decodedStr = mb_convert_encoding($decodedStr, $iconv_to, "UTF-8");
}

に書き換えるだけね。ま、実際のところ、内部コードに変換する場合がほとんどだから、この部分を、
if (mb_internal_encoding() != "UTF-8") {
    $decodedStr = mb_convert_encoding($decodedStr, mb_internal_encoding(), "UTF-8");
}

とでもしちゃえば、いちいち変換コードを指定しなくても済むんだけどね。ま、そのへんは使用する環境次第でってことで。

Posted by “Lupin” on 2007/09/10 18:02:22
コメント
コメントはありません。
●コメント投稿
このエントリーにはコメント投稿できません。