在UTF-8中显示法语重音字符的问题

8
我正在处理一个用CakePHP构建的法语网站。我尝试了多种方法来将文本转换为UTF-8并正确显示,但迄今为止没有成功——任何带重音符号的字母都会显示成一个黑色钻石和问号。当我将浏览器中的字符集更改为ISO-8859-1时,这些字母可以正确地显示。但我想让整个网站符合UTF-8标准。我使用了以下方法:html_entity_decode($string, ENT_QUOTES, 'UTF-8')、htmlspecialchars($string, ENT_QUOTES, 'UTF-8')以及utf8_encode,但是它们都不起作用。页面头信息声明UTF-8编码,MySQL数据库也在使用UTF-8编码。请问如何使带重音符号的字符可以在UTF-8下正常显示?

抱歉,不知道如何接受答案,现在已经做到了。 - igniteflow
1
一般情况下,您无需进行任何转换。只需将用户文本存储而不进行任何编码,然后仅使用htmlspecialchars显示即可。 - Your Common Sense
4个回答

9

检查你的@@character_set_results。默认情况下,MySQL使用的是latin1而非utf8。尝试使用SET NAMES utf8mysqli::set_charset

更新:以下是如何检查正在使用的字符集:

mysql> SHOW VARIABLES LIKE '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       | 
| character_set_connection | utf8                       | 
| character_set_database   | utf8                       | 
| character_set_filesystem | binary                     | 
| character_set_results    | utf8                       | 
| character_set_server     | utf8                       | 
| character_set_system     | utf8                       | 
| character_sets_dir       | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+

请访问dev.mysql.com了解更多关于IT技术方面的内容。


5

第一步: 检查你的php文件编码!我使用Mac,使用Coda进行编程,并且它有一个选项可以转换字符集。有时候我也会遇到类似的问题,将其转换为UTF-8通常可以解决。我认为Notepad++在Windows上也可以完成这一操作。(如果你对PHP文件进行了转换,那么文件中的每个字符串都不需要使用函数htmlspecialchars()html_entity_decode()等)

第二步: 如果您正在使用HTML输出,请检查您的头文件中是否有<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

第三步: 在MySQL数据库上执行@janmoesen所说的操作。

告诉我关于这个的一些内容。


1
你真是太棒了。我从未想到这可能是由于实际文件编码引起的。 - John Magnolia

3

我刚刚解决了一个与重音字符不显示非常相似的问题。我的数据库表是utf-8编码的,我的html头部已正确设置为utf-8。

我未为我的MySQL连接指定字符集,在我的情况下,我使用的是PDO。

$this->pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8;", $username, $password);

现在没有问题!

1

如果有人使用PHP类库,这可能会有所帮助。

我的解决方案是将字符编码设置为我的连接。

//connect to MySQL and select DB
public function open_connection() {
    $this->connection = new mysqli( DB_SERVER, DB_USER, DB_PASS, DB_NAME );
    if ( !$this->connection ) {
        die( "Database connection failed: " . mysqli_error() );
    }
    mysqli_set_charset($this->connection,"utf8");
}

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