JAMADAM.COM

RSS Subscribe to my RSS feed

Stripe Calendar

Sep, 2010
Aug 1213141516171819202122232425262728293031 Sep 123456

Entry: 縮.jpのバグを直した

縮.jpのバグを直した

Initial post: 2009.07.30 | Last modified: 2009.07.30

先日、縮.jpを国際化ドメイン対応にした際にパス名がぶった切られてたのに気づいたので直した。そして、せっかくなので国際化ドメインへの対応方法について、ちらしの裏的メモ。

Locationヘッダにutf8のバイト列を流し込んでもうまく行かなかったのでpunycodeに変換した。

use Net::IDN::Punycode;

my $url = 'http://例示.日本/path/';
my $fixed_url = '';

my ($schema, $domain, $uri) = ($url =~ m!(https?)://([^/]+)(.+)!);

foreach my $part (split(/¥./, $domain)) {
    if ($part =~ /¥P{IsASCII}/) {
        $fixed_url .= 'xn--'. encode_punycode($part). '.';
    } else {
        $fixed_url .= $part. '.';
    }
}
chop($fixed_url);

printf("Location: %s://%s¥n¥n", $schema, $fixed_url. $uri);

cpanでいくつかモジュールが見つかるけど、Net::IDN::Punycodeが正解。IDNA::Punycodeは古いから利用率高いけどバグもの。

上記の結果は

http://xn--fsq192h.xn--wgv71a/path/

ちなみに国際化ドメインと国際化URI(って呼んでいいのか?)への対処方法は全く別で、さらに国際化URIは国際化ファイル名と国際化クエリーに対処しないとならない気がするので、その辺を今度整理してみよう。