如何使用 file_get_contents 以正确的 utf-8 编码获取文件内容?

How to get file content with a proper utf-8 encoding using file_get_contents?

我需要获取 utf-8 编码的远程文件的内容。该文件在 utf-8 中。当我在屏幕上显示该文件时,它具有正确的编码:

http://www.parfumeriafox.sk/source_file.html

(注意 ňč 字符,例如,这些都可以)。

当我运行这段代码时:

<?php

$url = 'http://parfumeriafox.sk/source_file.html';

$csv = file_get_contents_utf8($url);
header('Content-type: text/html; charset=utf-8');
print $csv;

function file_get_contents_utf8($fn) {
  $content = file_get_contents($fn);
  return mb_convert_encoding($content, 'utf-8');
}

(您可以使用 http://www.parfumeriafox.sk/encoding.php 运行),然后我得到问号而不是那些特殊字符。我对此进行了大量研究,我尝试了标准 file_read_contents 函数,我什至使用了一些流 bla bla php 上下文函数,我还尝试了 fopen 和 fread 函数来读取二进制级别的文件,似乎没有任何效果。我已经尝试过发送和不发送 header。这应该是非常简单的,我做错了什么?当我用一些编码检测函数检查那个字符串时,它 returns UTF-8.

这个怎么样????

为此我使用了 header('Content-Type: text/plain;; charset=Windows-1250');

佛手柑、香柠檬、tráva、rebarbora、bazalka;levanduľa、škorica、hruška;céderové drevo、vanilka、pižmo、amberlyn



这个代码对我有用

<?php
header('Content-Type: text/plain;charset=Windows-1250');
echo file_get_contents('http://www.parfumeriafox.sk/source_file.html');
?>


问题不在于 file_get_contents()

我将 $data 保存到一个文件中,字符是正确的,但我的文本编辑器仍然没有正确编码。见下图。

$data = file_get_contents('http://www.parfumeriafox.sk/source_file.html');
file_put_contents('doc.txt',$data);

更新

这里显示的似乎是一个有问题的字符。 它也出现在下面的 HTML 图像中。呈现为 ¾

其十六进制值为 xBE(十进制 190)

我试过这两个字符集。都没有用。

header('Content-Type: text/plain; charset=ISO 8859-1');
header('Content-Type: text/plain; charset=ISO 8859-2');




更新结束


它通过添加 header WITHOUT charset=utf-8.

来工作

这两个 header 有效

header('Content-Type: text/plain');
header('Content-Type: text/html');

这两个 header 不起作用

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

此代码已测试并显示所有字符。

<?php
header('Content-Type: text/plain');
echo file_get_contents('http://www.parfumeriafox.sk/source_file.html');
?>

<?php
header('Content-Type: text/html');
echo file_get_contents('http://www.parfumeriafox.sk/source_file.html');
?>



这些是一些有问题的字符及其十六进制值。
这是使用 UTF-8 编码在 Notepad++ 中查看的保存文件。

根据这些字符集检查十六进制值。

从上面table我看到字符集是Latin2.

我去了Wikipedia Windows code page,发现Latin2是Windows-1250


佛手柑、香柠檬、tráva、rebarbora、bazalka;levanduľa、škorica、hruška;céderové drevo、vanilka、pižmo、amberlyn

您可以通过打开开发人员控制台并查看 document.characterSet:

来查看您的浏览器决定文档使用的字符集
> document.characterSet
"windows-1250"

有了这些知识,我们可以要求 iconv 为我们从 "windows-1250" 转换为 utf-8:

<?php
$text = file_get_contents("source_file.csv");
$text = iconv("windows-1250", "utf-8", $text);
print($text);

输出是有效的 utf-8,levanduľa 也能正确显示。