首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UTF8编码问题

UTF8编码问题
EN

Stack Overflow用户
提问于 2021-03-20 23:10:59
回答 1查看 41关注 0票数 0

我有以下代码:

代码语言:javascript
复制
    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通常出现在结束字符串中。

谢谢大家。

EN

回答 1

Stack Overflow用户

发布于 2021-03-21 00:55:48

utf8_encodeutf8_decode是命名糟糕的函数,您很少需要它们。

让我们来看看您正在使用的编码:

代码语言:javascript
复制
htmlspecialchars($string, ENT_QUOTES, "UTF-8")

在这里,您告诉htmlspecialchars您的字符串被编码为UTF-8。到现在为止还好。

代码语言:javascript
复制
$string = utf8_decode(...);

现在,告诉utf8_decode将字符串从UTF-8转换为ISO-8859-1编码。ISO-8859-1是一种单字节编码,它只能表示256个不同的字符,并且肯定不包含任何表情符号。如手册所述:

字符串中不是有效

-8的UTF字节,以及ISO-8859-1中不存在的UTF-8字符(即U+00FF以上的字符)将替换为?

在执行完其余代码后,您可以运行以下代码:

代码语言:javascript
复制
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模式。

简而言之,试试这个:

代码语言:javascript
复制
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);
}

或者这样:

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66723146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档