Utf8编码/特殊字符难题


Utf8 Encoding/Special Characters Conundrum

我的php从数据库读取一些产品属性。文本读取为utf-8。

为了测试的目的:当它解析数据时,我输出一些到浏览器,它完美地呈现。Notre Protéine de Soja 90 en poudre fournit plus de 90% de protéines de soja par 100g (base sèche) vérifié par les derniers résultats des tests indépendants réalisés sur nos produits. .

然后我试着用php写一个文件,像这样-

file_put_contents(filename,  utf8_encode($data));

file_put_contents(filename, $data);

$handle = fopen($filename, 'w');
fwrite($handle,utf8_encode($data));
fclose($handle);

$handle = fopen($filename, 'w');
fwrite($handle,$data);
fclose($handle);

由于某些原因当它将数据写入文件然后我通过文件查看数据时数据更改为这个Notre Protéine de Soja 90 en poudre fournit plus de 90% de protéines de soja par 100g (base sèche) vérifié par les derniers résultats des tests indépendants réalisés sur nos produits.

**主要的问题是法语口音被改变了。(元音上方斜线)**

我想可能是文件格式不同,所以在命令行中我做了以下操作-

php > $e = file_get_contents('filename.csv');
php > echo mb_detect_encoding($e);
UTF-8
php > $e = file_get_contents('filename.csv');
php > echo mb_detect_encoding($e);
UTF-8
php >

所以这个文件是utf-8编码,这也是我在浏览器上输出它时的文本。这是否意味着对文本的更改不是编码问题?如果不是,是什么?

看起来数据是实体编码的,这意味着任何具有等效HTML实体的特殊字符都会被翻译。这是为了在网页上正确显示字符。

我的猜测是,您从数据库接收到的字符串是有意在数据库中编码的实体,并且当您显示它们时,它们应该显示(因为浏览器对实体进行解码),但在文本文件中您可以看到实体。

我想说这里没有问题!但是如果你想要一个没有实体的字符串,你可以通过html_entity_decode()运行它。

编辑:decze的答案解释得更好!

éHTML实体,表示文本中的"特殊"字符是HTML编码的。这与UTF-8或utf8_encodefile_put_contents无关;这些函数都不会对进行html编码。

很可能数据库中的原始数据是HTML编码的,但是在将内容放入文件之前没有注意到这一点,因为向浏览器输出HTML实体会将这些实体呈现为它们所表示的常规字符。