mySQL表中的重音字符

时间:2012-12-29 16:52:23

标签: php mysql unicode utf-8 non-ascii-characters

我有一些法语文本(包含重音字符,如“é”),存储在一个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而不是改变编码而不理解为什么它可以工作。^^;)

6 个答案:

答案 0 :(得分:30)

之前我遇到过同样的问题,我做的是以下

1)使用notepad ++(几乎可以适应任何编码)或eclipse,并确保以UTF-8保存或打开它而无需BOM

2)使用header('Content-type: text/html; charset=UTF-8');

在PHP标头中设置编码

3)删除PHP文件开头和结尾的任何多余空格。

4)通过PhpMyAdmin或您拥有的任何mySQL客户端将我的所有表和列编码设置为utf8mb4_general_ciutf8mb4_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)不要使用?>

结束PHP源文件

注意:

但如果我上面说的所有内容都不起作用,请尝试根据您真正想要显示的字符集调整编码,对我来说,我将所有内容都设置为SHIFT-JIS以显示我所有的日文字符和它真的很好。但使用UFT-8必须是您的首选

答案 1 :(得分:15)

这对我有用

  1. 制作数据库utf8_general_ci
  2. 将文件保存为N ++ UTF-8 without BOM
  3. 在与PHP文件中的数据库连接后放置$mysqli->query('SET NAMES utf8');
  4. < meta charset="utf-8" />放入HTML-s
  5. 完美的作品。

答案 2 :(得分:2)

如果您的php.ini default_charset未设置为UTF-8,则需要使用Content-type来定义数据。在文件顶部应用以下标题:

header("Content-type: text/html; charset=utf-8");

如果您仍然遇到编码问题,原因可能是以下之一:

  • 数据库服务器字符集问题(检查服务器的编码)
  • 数据库客户端字符集问题(检查连接的编码)
  • 数据库表charset问题(检查表的编码)
  • php默认编码问题(在parameters.ini中检查default_encoding参数)
  • 多字节未配置(请参阅parameters.ini中的mb_string参数)
  • <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)

  1. 在您的(php)文件中输入完整的法国标志
  2. 将该文件另存为UTF-8
  3. 在您的网站标题下面粘贴一行

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

  4. 页面(文件)应该看起来不错。

    如果在(SET_NAMES)之后看起来很好,请查看here的mysql行为。