web-dev-qa-db-ja.com

file_get_contents()はUTF-8文字を分割します

外部サーバーからHTMLをロードしています。 HTMLマークアップにはUTF-8エンコードがあり、ľ、š、č、ť、žなどの文字が含まれています。このようにfile_get_contents()でHTMLをロードすると、

$html = file_get_contents('http://example.com/foreign.html');

UTF-8文字を台無しにして、適切なUTF-8文字の代わりにÅ、¾、¤および同様のナンセンスをロードします。

どうすれば解決できますか?

更新:

HTMLをファイルに保存し、UTF-8エンコーディングで出力することを試みました。両方とも機能しないため、file_get_contents()はすでに壊れたHTMLを返しています。

更新2:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="sk" lang="sk">
<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Language" content="sk" />
<title>Test</title>

</head>
<body>


<?php

$html = file_get_contents('http://example.com');
echo htmlentities($html);

?>

</body>
</html>
58
Richard Knop

わかった。 file_get_contents()がこの問題を引き起こしていないことがわかりました。別の理由で、別の質問で説明します。愚かな私。

この質問を参照してください: なぜDOMはエンコードを変更するのですか?

6
Richard Knop

ポーランド語で同様の問題がありました

私は試した:

$fileEndEnd = mb_convert_encoding($fileEndEnd, 'UTF-8', mb_detect_encoding($fileEndEnd, 'UTF-8', true));

私は試した:

$fileEndEnd = utf8_encode ( $fileEndEnd );

私は試した:

$fileEndEnd = iconv( "UTF-8", "UTF-8", $fileEndEnd );

その後 -

$fileEndEnd = mb_convert_encoding($fileEndEnd, 'HTML-ENTITIES', "UTF-8");

この最後は完璧に機能しました!!!!!!

102
ugniesdebesys

PHP file_get_contentsの手動入力)のコメントで提案された解決策

function file_get_contents_utf8($fn) {
     $content = file_get_contents($fn);
      return mb_convert_encoding($content, 'UTF-8',
          mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true));
}

http://php.net/manual/en/function.mb-internal-encoding.php で運試しをすることもできます

69
Gordon

私はあなたが単に文字タイプの二重変換を持っていると思う:D

HTMLドキュメント内でHTMLドキュメントを開いたためかもしれません。あなたは最終的にこのようなものを持っています

<!DOCTYPE html> 
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title></title>
</head>
<body>
<!DOCTYPE html> 
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Test</title>.......

の用法 mb_detect_encodingしたがって、他の問題につながる可能性があります。

5
Dr. Dama

これも試してください

 $url = 'http://www.domain.com/';
    $html = file_get_contents($url);

    //Change encoding to UTF-8 from ISO-8859-1
    $html = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $html);
2
Mohamm6d

トルコ語、mb_convert_encodingまたはその他の文字セット変換は機能しませんでした。

また、スペース文字が+ charに変換されたため、urlencodeは機能しませんでした。パーセントエンコーディングの場合は、%20でなければなりません。

これはうまくいきました!

   $url = rawurlencode($url);
   $url = str_replace("%3A", ":", $url);
   $url = str_replace("%2F", "/", $url);

   $data = file_get_contents($url);
2

私は35000行のデータを扱っています。

$f=fopen("veri1.txt","r");
$i=0;
while(!feof($f)){
    $i++;
    $line=mb_convert_encoding(fgets($f), 'HTML-ENTITIES', "UTF-8");
    echo $line;
}

このコードは、私の奇妙な文字を通常に変換します。

0
matasoy