[PHP] 日本語ドメインのURLに対してfile_get_contents()する方法

PHPのfile_get_contentsは日本語ドメインに対応していないので、ピュニコードといわれる「xn--」が含まれるURLに変換して上げる必要がある

urlencodeなどの関数は使えないため、PEARのライブラリを利用して変換する。

目次

インストール方法

https://pear.php.net/package/Net_IDNA2/download

からライブラリをダウンロードしてマニュアルでインストールするか、

pear install Net_IDNA2-0.2.0

でインストール

注意

このライブラリは長い間メンテナンスがされていないため、普通に実行すると

AH01071: Got error 'PHP message: PHP Fatal error:  Array and string offset access syntax with curly braces is no longer supported in /php/lib/php/Net/IDNA2.php on line 2686', referer: 

というようなエラーが出る。これはPHPのバージョンでサポートされていない配列や文字列のオフセットアクセスの書き方(波括弧 {} を使用した方法)が使用されているためである。

なので、IDNA2.php内にある

$variable{index}

のような波括弧 {} を使用したものを

$variable[index]

というふうに角括弧 [] を使用するように変更する必要がある。自分で試した限りは5箇所くらいあった。

ちなみにコード内は$variable{index}という書き方ではないので検索できない。そのため、実行→エラー→修正を繰り返す必要がある

ライブラリの使い方

このライブラリの使い方は

require_once 'Net/IDNA2.php'; 
$punycode = Net_IDNA2::getInstance();
 
$encode = $punycode->encode('日本語ドメイン.com');
$decode = $punycode->decode('xn--eckwd4c7c5976acvb2w6i.com');

という感じで使う。ちなみにすでにエンコードしているURLをさらにエンコードしようとするとエラーになるので

require_once 'Net/IDNA2.php'; 
$punycode = Net_IDNA2::getInstance();

$url = '日本語ドメイン.com';

if (mb_strpos($url, 'xn--') === false) {
       $encoded_url = $punycode->encode($url);
} else {
       $encoded_url = $url; // 既に punycode ならそのまま使用する
}
 
file_get_contents($encoded_url);

という形で利用する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です