无法解码一些特殊字符 ’ “ ”

Rob*_*Rob 3 php html-encode utf-8 html-entities

我正在尝试解码 php 中的一些特殊字符,但似乎无法找到一种方法来做到这一点。

 $str = 'Thi’s i"s a’n e”xa“mple';
Run Code Online (Sandbox Code Playgroud)

这只是返回一些点。

$str = preg_replace_callback("/(&#[0-9]+;)/", function($m) {
    return mb_convert_encoding($m[1], "UTF-8", "HTML-ENTITIES");
}, $str);
Run Code Online (Sandbox Code Playgroud)

其他一些测试只返回相同的字符串。

$str = html_entity_decode($str, ENT_QUOTES, 'UTF-8');
$str = htmlspecialchars_decode($str, ENT_QUOTES);
Run Code Online (Sandbox Code Playgroud)

无论如何,我一直在尝试各种组合,但真的不知道如何将其转换为 UTF-8 字符。

我期待看到的是:

Thi’s i"s a’n e”xa“mple
Run Code Online (Sandbox Code Playgroud)

实际上,如果我直接使用htmlentities它并对其进行编码,我会看到不同的字符开始。

Thi’s i"s a’n e”xa“mple
Run Code Online (Sandbox Code Playgroud)

不幸的是,我无法控制来源,而且我一直在处理这些角色。

它们是非标准的,我是否需要用我自己的查找表手动替换它们?

编辑

在此处查看此表:https : //brajeshwar.github.io/entities/

我看到我正在寻找的角色没有列出。当我测试这个表中的几个字符时,它们解码得很好。我猜php中的列表默认不完整?

zer*_*kms 5

如果您检查所指字符的 unicode 标准:http : //www.unicode.org/charts/PDF/U0080.pdf

您会看到字符串中的所有代码点都没有可表示的字形并且是控制字符。

这意味着它们应该被渲染为空方块(或点,取决于你的渲染器如何处理它们)。

如果它对某个地方的某个人有效 - 这是一种非标准行为,人们不能依赖它,因为它是非标准的。

显然,您拥有的文本具有 cp1250 的初始编码,因此您应该相应地对其进行处理,或者手动重新编码实体:

$str = 'Thi’s i"s a’n e”xa“mple';

$str = preg_replace_callback("/&#([0-9]+);/u", function($m) {
    return iconv('cp1250', 'utf-8', chr($m[1]));
}, $str);

echo $str;
Run Code Online (Sandbox Code Playgroud)