Utf8 Encoding/Special 字符难题

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().

运行 它

编辑:deceze 的回答更好地解释了这一点!

é 是一个 HTML 实体 ,意思是文本中的 "special" 个字符是 HTML 编码的。这与 UTF-8 或 utf8_encodefile_put_contents 无关; none 这些函数将 HTML-encode 一个字符串。

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