mrd*_*iri 4 php unicode hex html-entities
如何将Unicode字符串转换为HTML实体?(HEX不是十进制)
例如,转换Français为Français.
对于相关问题中缺少的十六进制编码:
$output = preg_replace_callback('/[\x{80}-\x{10FFFF}]/u', function ($match) {
list($utf8) = $match;
$binary = mb_convert_encoding($utf8, 'UTF-32BE', 'UTF-8');
$entity = vsprintf('&#x%X;', unpack('N', $binary));
return $entity;
}, $input);
Run Code Online (Sandbox Code Playgroud)
这是类似于使用@巴巴的回答UTF-32BE,然后unpack和vsprintf该格式的需求.
如果你喜欢iconv了mb_convert_encoding,这是类似的:
$output = preg_replace_callback('/[\x{80}-\x{10FFFF}]/u', function ($match) {
list($utf8) = $match;
$binary = iconv('UTF-8', 'UTF-32BE', $utf8);
$entity = vsprintf('&#x%X;', unpack('N', $binary));
return $entity;
}, $input);
Run Code Online (Sandbox Code Playgroud)
我发现这个字符串操作比获取html实体的十六进制代码要清楚一点.
您的字符串看起来像UCS-4您可以尝试的编码
$first = preg_replace_callback('/[\x{80}-\x{10FFFF}]/u', function ($m) {
$char = current($m);
$utf = iconv('UTF-8', 'UCS-4', $char);
return sprintf("&#x%s;", ltrim(strtoupper(bin2hex($utf)), "0"));
}, $string);
Run Code Online (Sandbox Code Playgroud)
产量
string 'Français' (length=13)
Run Code Online (Sandbox Code Playgroud)
首先,当我最近遇到这个问题时,我通过确保我的代码文件、数据库连接和数据库表都是UTF-8来解决它,然后,简单地回显文本即可。如果必须转义数据库的输出,请使用htmlspecialchars()而不是htmlentities()这样,UTF-8 符号将被单独保留并且不会被尝试转义。
想要记录一个替代解决方案,因为它为我解决了类似的问题。我使用 PHPutf8_encode()来转义“特殊”字符。
我想将它们转换为 HTML 实体进行显示,我编写这段代码是因为我想尽可能避免 iconv 或此类函数,因为并非所有环境都必须有它们(如果不是这样,请纠正我!)
function unicode2html($string) {
return preg_replace('/\\\\u([0-9a-z]{4})/', '&#x$1;', $string);
}
$foo = 'This is my test string \u03b50';
echo unicode2html($foo);
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助有需要的人:-)