14

我有一些法语文本(包含重音字符,例如“é”),存储在排序为 utf8_unicode_ci(表和列)的 MySQL 表中,我想在 HTML5 页面上输出。

HTML 页面字符集是 UTF-8 (< meta charset="utf-8" />),PHP 文件本身被编码为“UTF-8 without BOM”(我在 Windows 上使用 Notepad++)。我使用 PHP5 请求数据库并生成 HTML。

但是,在输出页面上,特殊字符(例如“é”)出现乱码并被“�”替换。

当我浏览数据库(通过 phpMyAdmin)时,这些相同的重音字符显示得很好。

我在这里想念什么?

(注意:将页面编码(通过 Firefox 的“Web 开发人员”菜单)更改为 ISO-8859-1 可以解决问题……除了直接出现在 PHP 文件中的特殊字符,这些字符现在已损坏。但无论如何,我'宁愿理解为什么它不能作为 UTF-8 工作,也不愿在不理解它为什么工作的情况下更改编码。^^;)

4

6 回答 6

34

我之前遇到过同样的问题,我所做的如下

1)使用notepad++(几乎可以适应任何编码)或eclipse,并确保在没有BOM的情况下以UTF-8保存或打开它

2) 在 PHP 标头中设置编码,使用header('Content-type: text/html; charset=UTF-8');

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

4)将我所有的表和列编码设置为utf8mb4_general_ciutf8mb4_unicode_ci通过 PhpMyAdmin 或您拥有的任何 mySQL 客户端。此处提供了两种编码的比较

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 字体将其包含在您的 CSS 中

10)不要结束你的PHP源文件?>

笔记:

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

于 2012-12-29T17:01:44.810 回答
18

这对我有用

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

完美运行。

于 2012-12-29T17:01:27.627 回答
2

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

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

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

  • 数据库服务器字符集问题(检查服务器的编码)
  • 数据库客户端字符集问题(检查连接的编码)
  • 数据库表字符集问题(检查表的编码)
  • 一个php默认编码问题(检查default_encodingparameters.ini中的参数)
  • 多字节配置错误(请参阅 parameters.ini 中的 mb_string 参数)
  • <form>字符集问题(检查它是否以 utf-8 格式发送)
  • <html>字符集问题(在您的 html 文件中未设置 enctype )
  • 一个Content-encoding:问题(Apache 发送了错误的编码)。
于 2012-12-29T17:01:02.673 回答
2

SET NAMES 为我工作。

我的问题是在我的一个编辑页面中,带有外来字符的字段不会显示,在生产网页上没有问题。

于 2015-01-08T15:44:45.387 回答
2

我知道你已经有了答案。那太棒了。但奇怪的是,这些答案都没有解决我的问题。为了其他可能遇到相同问题的人的利益,我想分享我的答案。

关于多语言应用程序中的法语口音,我也遇到了与 OP 相同的问题。

但是当我不得不在 AJAX 调用中将(法语重音)数据作为段传递时,我第一次遇到了这个问题。

是的,我们必须将数据库设置为使用 UTF8。但事实上 AJAX 调用有查询字符串(在我的案例中,因为我使用的是 CodeIgniter),所以我不得不简单地对法语文本进行编码。

要在客户端执行此操作,请对您的数据使用 Javascript encodeURI() 函数。

而要在 PHP 中反转它,只需使用urldecode($MyStr)接收数据的位置作为参数。

希望这可以帮助。

于 2016-07-25T04:49:55.060 回答
1
  1. 在您的 (php) 文件中输入完整的法语符号

  2. 将该文件另存为 UTF-8

  3. 将下面的行粘贴到您的网站标题中

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

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

如果看起来不错,请在 ( SET_NAMES ) 之后查看 mysql 行为。

于 2012-12-29T17:02:04.530 回答