我有一些法语文本(包含重音字符,如“é”),存储在一个MySQL表中,其排序规则为utf8_unicode_ci(包括表格和列),我想在HTML5页面上输出。
HTML页面字符集是UTF-8(< meta charset =“utf-8”/>),PHP文件本身编码为“没有BOM的UTF-8”(我在Windows上使用Notepad ++)。我使用PHP5来请求数据库并生成HTML。
但是,在输出页面上,特殊字符(例如“é”)显示为乱码并被“ ”替换。
当我浏览数据库(通过phpMyAdmin)时,那些相同的重音字符显示得很好。
我在这里缺少什么?
(注意:将页面编码(通过Firefox的“web开发人员”菜单)更改为ISO-8859-1解决了问题...除了直接出现在PHP文件中的特殊字符,现在已经损坏了。但是无论如何,我宁愿理解为什么它不能用作UTF-8而不是改变编码而不理解为什么它可以工作。^^;)
答案 0 :(得分:30)
之前我遇到过同样的问题,我做的是以下
1)使用notepad ++(几乎可以适应任何编码)或eclipse,并确保以UTF-8保存或打开它而无需BOM 。
2)使用header('Content-type: text/html; charset=UTF-8');
3)删除PHP文件开头和结尾的任何多余空格。
4)通过PhpMyAdmin或您拥有的任何mySQL客户端将我的所有表和列编码设置为utf8mb4_general_ci
或utf8mb4_unicode_ci
。可以使用here
5)将mysql连接字符集设置为UTF-8(我使用PDO进行数据库连接)
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET utf8"
或者只是在获取任何数据之前执行SQL查询
6)使用元标记<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
7)使用法语的某种语言代码
<meta http-equiv="Content-language" content="fr" />
8)将html元素lang属性更改为所需的语言
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
并且会更新这个因为我之前很难解决这个问题,因为我在过去的项目中处理日文字符
9)客户端PC中没有某些字体,您需要使用Google fonts将其包含在CSS中
10)不要使用?>
注意:强>
但如果我上面说的所有内容都不起作用,请尝试根据您真正想要显示的字符集调整编码,对我来说,我将所有内容都设置为SHIFT-JIS
以显示我所有的日文字符和它真的很好。但使用UFT-8
必须是您的首选
答案 1 :(得分:15)
这对我有用
utf8_general_ci
UTF-8 without BOM
$mysqli->query('SET NAMES utf8');
< meta charset="utf-8" />
放入HTML-s 完美的作品。
答案 2 :(得分:2)
如果您的php.ini
default_charset
未设置为UTF-8,则需要使用Content-type
来定义数据。在文件顶部应用以下标题:
header("Content-type: text/html; charset=utf-8");
如果您仍然遇到编码问题,原因可能是以下之一:
default_encoding
参数)<form>
字符集问题(检查它是否以utf-8格式发送)<html>
字符集问题(你的html文件中没有设置enctype)Content-encoding:
问题(Apache发送了错误的编码)。答案 3 :(得分:2)
SET NAMES为我工作。
我的问题是在我的一个编辑页面中,外国字符的字段无法显示,在生产网页上没有问题。
答案 4 :(得分:2)
我知道你已经有了答案。那很棒。但奇怪的是,这些答案都没有解决我的问题。我想与其他可能遇到同样问题的人分享我的答案。
我也有与OP相同的问题,关于多语言应用中的法语口音。
但是当我不得不在AJAX调用中将(法语重音)数据作为段传递时,我第一次遇到这个问题。
是的,我们必须将数据库设置为使用UTF8。但是AJAX调用的事实有查询字符串(在我的案例中,因为我使用的是CodeIgniter),我不得不简单地对法语文本进行编码。
要在客户端执行此操作,请将Javascript encodeURI()函数与您的数据一起使用。
要在PHP中对其进行反转,只需使用urldecode($MyStr)
作为参数接收数据。
希望这有帮助。
答案 5 :(得分:1)
在您的网站标题下面粘贴一行
header('Content-Type: text/html; charset=utf-8');
页面(文件)应该看起来不错。
如果在(SET_NAMES)之后看起来很好,请查看here的mysql行为。