3

yahoo.comから検索結果を取得しようとしています。

ただし、 file_get_contents()は、UTF-8文字セット(yahooが使用する文字セット)のコンテンツをISO-8859-1に変換します。

試す:

$filename = "http://search.yahoo.com/search;_ylt=A0oG7lpgGp9NTSYAiQBXNyoA?p=naj%C5%A1%C5%A5astnej%C5%A1%C3%AD&fr2=sb-top&fr=yfp-t-701&type_param=&rd=pref";

echo file_get_contents($filename);

スクリプトとして

header('Content-Type: text/html; charset=UTF-8');

また

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

また

$er = mb_convert_encoding($filename , 'UTF-8');

また

$s2 = iconv("ISO-8859-1","UTF-8",$filename );

また

echo utf8_encode(file_get_contents($filename));

Webコンテンツを取得した後、šťžのような特殊文字が疑問符に置き換えられるため、役に立ちません???

どんな助けでもいただければ幸いです。

4

4 に答える 4

7

おそらく文字エンコードとしてISO8859-1のみを受け入れる要求を送信するため、これはコンテンツネゴシエーションの問題のようです。file_get_contents

UTF-8を受け入れることを明示的に示す使用用のカスタムストリームコンテキストを作成できます。file_get_contentsstream_context_create

$opts = array('http' => array('header' => 'Accept-Charset: UTF-8, *;q=0'));
$context = stream_context_create($opts);

$filename = "http://search.yahoo.com/search;_ylt=A0oG7lpgGp9NTSYAiQBXNyoA?p=naj%C5%A1%C5%A5astnej%C5%A1%C3%AD&fr2=sb-top&fr=yfp-t-701&type_param=&rd=pref";
echo file_get_contents($filename, false, $context);
于 2011-04-09T11:37:38.520 に答える
3

file_get_contentsは文字セットを変更しないでください。データはバイナリ文字列として取り込まれます。

あなたが提供したURLをチェックアウトするとき、これはそれが提供するヘッダーです:

Content-Type: text/html; charset=ISO-8859-1

また、体内で:

<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">

また、UTF-8をロスレスでISO-8859-1に変換し、UTF-8に戻ったときに文字を元に戻すことはできません。UTF-8 / unicodeはさらに多くの文字をサポートしているため、最初のステップで文字が失われます。

ブラウザではそうではないので、おそらく、UTF-8を受け入れることができるようにyahooのシステムに指示するために、正しいAccept-Encodingヘッダーを提供する必要があります。

于 2011-04-08T20:46:40.790 に答える
1
$s2 = iconv("ISO-8859-1","UTF-8//TRANSLIT//IGNORE",$filename );

より良い解決策...

function curl($url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_ENCODING, 1);
    return curl_exec($ch);
    curl_close($ch);
}

echo curl($filename);
于 2011-04-08T20:21:44.560 に答える
1

これを調査している人のために:

エンコーディングの問題に費やした時間は、php関数が文字列のエンコーディングを「魔法のように」変更することはめったにないことを教えてくれました。(これらのまれな例の1つは:

exec($ command、$ output、$ returnVal)

作業ヘッダーセットは次のとおりであることに注意してください。

header('Content-Type:text / html; charset = utf-8');

ではなく:

header('Content-Type:text / html; charset = UTF-8');

あなたが説明したのと同様の問題があったので、ヘッダーを適切に設定するだけで十分でした。

お役に立てれば!

于 2015-06-18T12:21:28.317 に答える