2017-08-25 37 views
1

我想解码一些特殊字符在PHP中,似乎无法找到办法做到这一点。解码一些特殊字符的问题’ “ ”

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

这只是返回一些点。

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

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

$str = html_entity_decode($str, ENT_QUOTES, 'UTF-8'); 
$str = htmlspecialchars_decode($str, ENT_QUOTES); 

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

什么,我期待看到这是:

Thi’s i"s a’n e”xa“mple 

而实际上,如果我采取这种直接使用htmlentities编码它,我看到不同的角色开始。

Thi’s i"s a’n e”xa“mple 

不幸的是,我没有对源代码的控制,而且我被卡在处理这些字符。

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

编辑

望着这桌的位置:https://brajeshwar.github.io/entities/

我看到我在寻找后未列出的字符。当我测试这个表中的几个字符时,它们解码得很好。我猜在PHP中的列表默认是不完整的?

+1

我得到预期的结果有三种方法.. 。 –

+0

html_entity_decode工作正常。你使用的是什么版本的PHP?当你写下“我期待看到的东西”是什么意思? – gview

+0

'''不是unicode码点146(U + 0092),而是U + 2019。即使它适合某个地方的某个人 - 这只是一个巧合,现在一般来说应该可以工作。 – zerkms

回答

2

如果你检查你指的是字符的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; 
+0

把原始字符串放在一个HTML文档中,我会看到输出OP在 – Phil

+0

@Phil之后,因为它是以某种方式呈现某些应用程序并不意味着这些字符具有字形,浏览器可以原谅很多错误并尝试做出帮助 – zerkms

+1

哦,我的意思是它没有不要太那么*“某人,某处”* – Phil