UTF-8特殊字符无法显示

28

我将我的网站从本地测试服务器迁移到了NameCheap共享托管,现在遇到了一个问题 - 一些页面无法正确显示utf-8特殊字符(显示问号)。所有页面都是utf-8编码的,所有数据库表也是如此。奇怪的是,一些页面可以正确显示,而一些页面不行,似乎是随机的模式。

例如,我的首页没问题,但我的个人资料页面有问题。faq.html可以正常工作,但重命名为faq.php后就不行了。最奇怪的是,我有一个带有两个JQuery选项卡的页面,其中一个可以正确显示,另一个却不能!

有人能帮我解决这个问题吗?


1
你是否使用开发者工具(大多数浏览器中的F12)检查了编码? - Jan Dragsbaek
是的,它表示所有页面都是utf-8编码。 - robert
9个回答

51

这是一个很麻烦的问题,但你可以尝试以下方法。

首先,请确保文件实际上已保存为UTF-8格式。

然后检查在你的HTML头部是否有<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">

你也可以尝试在PHP脚本的开头调用 header('Content-Type: text/html; charset=utf-8'); 或者在你的 .htaccess 文件中添加 AddDefaultCharset UTF-8


1
我在头部设置了指定charset=utf-8的元标签。将AddDefaultCharset UTF-8添加到我的.htaccess中并没有起作用。我宁愿避免直接从PHP代码中解决问题,因为这是一个相当复杂的网站。 - robert
5
我的问题通常是实际的文件不是UTF-8格式。例如,ASCII字符ä如果浏览器读取为UTF-8,但实际文件不是,则会显示为 - RCE
实际的文件肯定是UTF-8编码,它们在我的EasyPHP中运行得非常完美。 - robert
1
太好了!这对我起作用了(我正在使用WordPress...蠢 WordPress!!!):AddDefaultCharset UTF-8 非常感谢! - Santiago Baigorria
我已经按照你们所说的在php中设置了utf-8。但是,正如@RCE所说,文件并不是UTF-8格式。我使用Notepad++将它们全部转换为UTF-8。然后,重音字符被转换成了方块,在运行网站时,这些方块变成了钻石内的问号。我不得不手动检查每个静态页面中的每个重音符号,以确保更改后葡萄牙语字符(ç、á、ã、é、à等)没有问题。 - Mário Meyrelles

6
似乎当您请求faq.html时,Web服务器会向浏览器发出文件使用UTF-8编码的信号。请检查您的浏览器所宣布和使用的编码,请参阅您的浏览器文档以了解如何进行操作。每个浏览器都有此功能,通常可以通过菜单访问(指定您希望使用哪个网站的编码),并且要查看服务器返回的内容,则通常可以在页面属性中找到。
然后似乎当您请求faq.php时,Web服务器向浏览器发出文件使用其他编码的信号。可能没有按默认PHP配置设置给出字符集/编码。由于这是一个PHP文件,因此您可以通过更改PHP配置default_charsetDocs指令来解决此问题。
default_charset = "UTF-8"

在主机上找到您的php.ini文件,并进行相应的编辑。

如果您没有可用的php.ini文件,您也可以通过使用ini_set文档函数进行编程来更改此设置:

ini_set('default_charset', 'UTF-8');

请注意,在脚本的早期更改此设置,因为PHP需要能够发送头文件才能使其工作,如果已经发送了头文件,则无法再次设置。

也可以手动发送Content-Type头行:

header('Content-Type: text/html; charset=UTF-8');

此外,在你输出的所有 HTML 页面中,也要在它们的HTML <head>部分添加以下标题,这是良好的实践:
<html>
  <head>
    ...
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    ...

希望这对您有所帮助。

谢谢,但我没有可用的php.ini文件。浏览器显示编码为utf-8,并且在所有浏览器中都是一样的。我在头部声明了正确的编码。我尝试将其添加到.htaccess文件中,但效果并不明显。你认为这可能与托管账户有关吗? - robert
使用ini_set能够显示字符,但它无法读取任何PHP内容! - robert
如果浏览器报告UTF-8编码,但无法正确显示,则您的数据可能出现了问题。编码就像一条链,如果其中一个元素出错,最终结果也会出错。请注意查找并定位不起作用的链中的元素。而“任何PHP内容”是什么意思? - hakre
我有一个包含PHP头文件的网页(只是一个带有一些链接的横幅)。当我使用ini_set函数时,页面不显示头文件 - 它的行为就像我将其重命名为.html文件。这些文件在我的EasyPHP上正常显示,它们如何在上传到托管账户后出现问题? - robert

4

如果您正在使用 PHP,而上述方法均未能解决问题(就像我的情况一样),则需要使用 utf-8 编码设置本地化(locale)。

像这样:

setlocale(LC_ALL, 'fr_CA.utf-8');

4
标签中设置meta标签
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> 

请使用链接 http://www.i18nqa.com/debug/utf8-debug.html 来替换您想要的符号字符。

然后使用 str_replace,如下:

    $find = array('“', '’', '…', '—', '–', '‘', 'é', 'Â', '•', 'Ëœ', 'â€'); // en dash
                        $replace = array('“', '’', '…', '—', '–', '‘', 'é', '', '•', '˜', '”');
$content = str_replace($find, $replace, $content);

这是我使用并帮助很多人的方法。谢谢!


3

我通过使用utf8_encode()解决了我的问题。

$str = "kamé";

echo utf8_encode($str);

希望这能帮助到某些人。


0
问题出在你的文件没有使用相同的编码方式。 请首先在所有文件中运行以下命令:
file -i filename.* 

为了解决问题,您需要将所有文件更改为uft-8。您可以使用命令iconv来完成:

iconv -f fromcode -t tocode filename > newfilename

例子:

iconv -f iso-8859-1 -t utf-8 index.html > fixed/index.html

在此之后,您可以运行 file -i fixedx/index.html 命令,然后您会看到您的文件现在已经是 utf-8 编码了。


0
如果其他答案对您无效,请尝试禁用HTTP输入编码转换
这是与PHP扩展mbstring相关的设置。 在我的情况下,这就是问题所在。这个设置在我的服务器上默认启用。

0

如果以上方法都不起作用,可能是mysqli连接编码的问题。

在我的情况下,php文件(whatever.php)采用UTF-8编码,HTML声明为UTF-8,数据库甚至也是UTF-8,但字符仍然无法正确显示。

显然,mysqli决定使用不同的编码方式。

所以我添加了

$conn->set_charset("utf8");

$conn = new mysqli($servername, $username, $password, $dbname);

之后,它就可以工作了。

如果您的数据库表是utf8mb4_unicode_ci而不是utf8_general_ci,则请改为:

$conn->set_charset("utf8mb4");

进入phpmyadmin(或您喜欢的数据库管理器)并检查您的表使用的编码方式,以选择正确的编码方式。

参考:https://www.php.net/manual/en/mysqli.set-charset.php


0
在 head 标签中添加以下行解决了我的问题。
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接