[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);
という形で利用する