ようこそ!浜村拓夫の世界へ

    ブログ内検索

    最近の記事

    ブックマーク数の多い記事

    Blog Translation

    Powered By FC2ブログ

    Powered By FC2ブログ
    ブログやるならFC2ブログ


    FC2ブログ LOGIN

    with Ajax Amazon

    PHPでPunycode変換

    このエントリーを含むはてなブックマーク はてなブックマーク - PHPでPunycode変換 あとで読む
    日本語を英数字へ変換する方法はいろいろありますが、変換後の文字列が比較的短くて済む方法がありました。
    DNSで使われている「Punycode変換」という方法です。

    ●国際化ドメイン名の仕組み
    現在のインターネットは、ドメイン名がASCII文字だけで記述される、という前提で、いろいろな仕組みが動いています。
    =厳密には、ドメイン名で使用可能な英数字にハイフン「-」を加えた37文字だけを使っています。

    英語圏以外の言語でドメイン名を表記したい場合、その国の文字で書かれたドメイン名を、最終的にASCII文字のドメイン名に変換することで、既存のインターネットで利用可能になります。

    ・文字コードとして、UNICODEを採用
    ・UNICODE文字(非ASCII文字)からASCII文字へ可逆的に変換する方法(ACE、ASCII Compatible Encoding)として、Punycode変換を採用

    ●Punycode
    Punycode(ピュニコード)は、RFC3492で規定されています。
    RFC3492
    http://www.ietf.org/rfc/rfc3492.txt
    RFC5891
    http://www.ietf.org/rfc/rfc5891.txt

    Punycode - 通信用語の基礎知識

    国際化ドメイン名を実現するために提案された符号法の一つで、その後正式に利用されることが決定された。
    RFC3492で規定され、このRFCはRFC5891で更新されている。

    従来のDNSで対応できる文字を含む場合は、それはそのまま使うことで全体的な文字数を減らす努力をしている。



    Punycode - Wikipedia

    Punycode(ピュニコード)とは、国際化ドメイン名で使われる文字符号化方式で、RFC 3492で定義されている。
    Unicodeで書かれた文字列をDNS内の制限された文字コード空間でも使えるようにするための方式で、ユーザーエージェントの実装に依存する。



    ピュニコード :Punycode変換・逆変換

    ピュニコード(Punycode)とは、漢字やひらがななどの文字を、英数字のみに変換するための変換規則(UNICODEの符号化)のひとつです。
    国際化ドメイン名で使われる文字符号化方式で、IETFによって RFC 3492で定義されています。

    ドメイン名として使える文字は、英数字とハイフン(-)の37文字です。
    Punycodeを使用する際は"xn--"を使用し続いてエンコード(英数字(ASCIIコード)に変換すること)された文字列で表します。

    例えば"http://日本語ドメイン.homepage.jp"の場合、
    "http://xn--eckwd4c7c5976acvb2w6i.homepage.jp/"

    例えば"http://名刺.homepage.jp"の場合、
    "http://xn--1cr47b.homepage.jp/"
    となります。

    Punycodeの由来は、提案者のAdam M Costelloによると「UNICODEの読みをもじったもの、と言われています。



    Punycode変換を試せるサイトがありました。

    日本語JPドメイン名のPunycode変換・逆変換 - 日本語.jp
    http://punycode.jp/

    (変換例)
    変換前 : 浜村
    変換後 : xn--brv87k

    変換前 : 浜村拓夫
    変換後 : xn--tssp8ttud1wh

    変換前 : 浜村拓夫の世界
    変換後 : xn--u9ju60gethrvjjtfgpktoo

    おー、いいねいいねー。短いよー。

    ●PHPでPunycode変換する方法
    PHPでPunycode変換するためのライブラリが提供されていました。

    PHP:Punycode Library | cloudrider.net
    (2011/01/06)

    PHP:Punycode Library
    include するだけで使える Punycode 変換ライブラリです。
    Github: takezoh/PHP-PunycodeEncoder

    こんな風に使えます。

    include('punycode.php');
    header('Content-Type: text/plain; charset=utf8');
    Punycode::set_options(array(
    'charset' => 'UTF-8'
    ));
    $a = Punycode::urlencode('http://ぷにぃこーど.jp');
    $b = Punycode::urldecode($a);
    var_dump($a, $b);



    takezoh/PHP-PunycodeEncoder
    こちらで提供されている「PHP-PunycodeEncoder」のソースコードを読むと、Punycode変換の処理がどうなっているのか、具体的によく分かりますね。

    * The MIT License
    * Copyright (c) 2011 Takehito Gondo



    MITライセンスで配布されており、作者はTakehito Gondoという方でした。
    権藤 丈人さん(Takehito Gondo) | Facebook

    http://blog.cloudrider.net
    https://github.com/takezoh/



    PEARでも、Punycode変換するライブラリーが提供されていました。

    PHPで日本語ドメインの扱う(punycodeに変換)するメモ! - MatsudaPress

    phpで簡単に変換ができるPearのライブラリが既に用意されておりました!
    ありがたや~!
    『Net_IDNA2』

    ※Net_IDNAはサポート終了らしいので、Net_IDNA2を選択(現時点で)
    落としたファイルをphpのファイルからrequire等できる場所において、
    下記サンプルプログラムを実行すると、変換されたドメインが表示されるようになります。

    require_once('Net/IDNA2.php'); //ダウンロードしたPEARのファイルを指定
    $idna = Net_IDNA2::getInstance();
    $enc = $idna->encode('日本語ドメイン');
    $dec = $idna->decode('Punycode');
    echo $enc; //エンコードされたドメイン名
    echo $dec; //デコードされたドメイン名



    Punycode変換の使いどころとして、パッと思いつくのは、
    ・Amazonの商品名
    ・WikiのURL
    を対象にして、利用してみるとか。

    便利な方法を考え、ライブラリーを提供してくださった方々に感謝します。
    どうもありがとうございます。
    関連記事

    コメント

    コメントの投稿


    管理者にだけ表示を許可する

    トラックバック

    トラックバックURL:
    http://hamamuratakuo.blog61.fc2.com/tb.php/797-9a1ca7c6

    FC2Ad