我有以下代码:
function parseMinecraftColors($string) {
$string = utf8_decode(htmlspecialchars($string, ENT_QUOTES, "UTF-8"));
$string = preg_replace('/\xA7([0-9a-f])/i', '<span class="mc-color mc-$1">', $string, -1, $count) . str_repeat("</span>", $count);
return utf8_encode(preg_replace('/\xA7([k-or])/i', '<span class="mc-$1">', $string, -1, $count) . str_repeat("</span>", $count));
}它将像Hi §5Person这样的字符串转换成它的超文本标记语言形式(带有基于颜色的类)。但是,当使用❤️或任何其他unicode时,它在输出中显示为?。
我不确定我可以去哪里解决这个问题,因为unicodes通常出现在结束字符串中。
谢谢大家。
发布于 2021-03-21 00:55:48
utf8_encode和utf8_decode是命名糟糕的函数,您很少需要它们。
让我们来看看您正在使用的编码:
htmlspecialchars($string, ENT_QUOTES, "UTF-8")在这里,您告诉htmlspecialchars您的字符串被编码为UTF-8。到现在为止还好。
$string = utf8_decode(...);现在,告诉utf8_decode将字符串从UTF-8转换为ISO-8859-1编码。ISO-8859-1是一种单字节编码,它只能表示256个不同的字符,并且肯定不包含任何表情符号。如手册所述:
字符串中不是有效
-8的UTF字节,以及ISO-8859-1中不存在的UTF-8字符(即U+00FF以上的字符)将替换为?
在执行完其余代码后,您可以运行以下代码:
return utf8_encode(...)这将告诉utf8_encode将您的ISO-8859-1字符串转换回UTF-8。但是已经太晚了,所有那些ISO-8859-1中不存在的漂亮表情符号都已经被转换成了?s,而且没有办法找回它们。
如果去掉utf8_decode和utf8_encode调用,您将遇到一个不同的问题:默认情况下,PCRE regex函数(比如preg_replace)只能处理单字节,但在UTF-8中,§是两字节长的。因此,当您替换字节A7时,您将替换“半个字符”,留下一个无效的字符串。
您可以使用以下两种方法之一来解决此问题:
C2 A7;例如,通过添加the u modifier并引用§的Unicode代码点(例如,preg_replace('/\xA7([0-9a-f])/iu', ...),将正则表达式转换为UTF8模式。
简而言之,试试这个:
function parseMinecraftColors($string) {
$string = htmlspecialchars($string, ENT_QUOTES, "UTF-8");
$string = preg_replace('/\xC2\xA7([0-9a-f])/i', '<span class="mc-color mc-$1">', $string, -1, $count) . str_repeat("</span>", $count);
return preg_replace('/\xC2\xA7([k-or])/i', '<span class="mc-$1">', $string, -1, $count) . str_repeat("</span>", $count);
}或者这样:
function parseMinecraftColors($string) {
$string = htmlspecialchars($string, ENT_QUOTES, "UTF-8");
$string = preg_replace('/\xA7([0-9a-f])/iu', '<span class="mc-color mc-$1">', $string, -1, $count) . str_repeat("</span>", $count);
return preg_replace('/\xA7([k-or])/iu', '<span class="mc-$1">', $string, -1, $count) . str_repeat("</span>", $count);
}https://stackoverflow.com/questions/66723146
复制相似问题