PHP 和 Mysql UTF-8(特殊字符)的问题

Posted

技术标签:

【中文标题】PHP 和 Mysql UTF-8(特殊字符)的问题【英文标题】:Problem with PHP and Mysql UTF-8 (Special Character) 【发布时间】:2011-10-27 18:05:53 【问题描述】:

我有一个带有一个名为(ProductTitle)的文本框的表单

如果我在文本框中写入示例“Étuit”并单击“保存”,我会将数据发布到名为 Product 的表中。 ProductTitle 数据库中的结果是 Étuit。我担心的是特殊字符。我没有将 É 放入数据库,而是得到了 É

当我将产品标题(“Étuit”)从数据库加载到跨度中时。正确显示。 但是当我将它加载到文本框中以编辑产品标题时,它显示了 Étuit。

任何人都知道为什么。

我把它放在html头中

<head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

注意:当我在表单上点击保存时,数据是使用 jquery ajax 方法发布的。

【问题讨论】:

你的数据库的排序规则是什么? 数据库和表上都是 utf8_general_ci @Jean-Francois 角色“É”没有什么“特别”之处。另外,请查看当前接受的答案。这是错误的。 【参考方案1】:

看看utf8_encode()utf8_decode()。也可以看看multibyte string functions。

【讨论】:

抱歉,但除非你能解释 utf8_encode 实际做了什么以及为什么这比@gview 的解决方案更好,否则我将不得不给你一个-1。 尝试使用utf8_encode/utf8_decode 将文本“エンコード”保存到您的 UTF-8 数据库(应该能够处理它,对吗?),并告诉我它是否仍在工作。 我不需要这些字符。我只需要像 éè 这样的法语字符。 @Jean-Francois 也许,但是使用此解决方案,您要么将垃圾存储在数据库中,要么将任何不属于 latin-1 编码的字符替换为问号,具体取决于您是否首先utf8_encode 然后解码,反之亦然。也许现在这不会打扰您,因为您只是碰巧只使用了 latin-1 可编码字符,但是 a)这样做您没有正确处理 UTF-8 并且 b)它可能有一天会回来咬您。要正确处理 UTF-8,请按照 @gview 的说明将数据库连接设置为 UTF-8。 感谢 deceze,我正确配置了我的数据库。你完全正确。做正确的事一天付钱:)【参考方案2】:

我也遇到了困难,但以下总是对我有用!在操作数据之前,请确保按如下方式设置编码:

try
  $dbh = new PDO($dsn, $user, $pass);
  $dbh->query("SET NAMES 'utf8'");
  print "Connected";
 

catch(PDOException $e)
  print "Error!!   " . $e->getMessage()."<br/>";
  die();
 

【讨论】:

【参考方案3】:

我只是在使用 mysqli lib 时使用 set_charset 方法。

error_reporting(E_ALL);

$mysqli = new mysqli('localhost', 'login', "pass", 'database');

if ( ! $mysqli->set_charset("utf8") )

   printf("Error loading character set utf8: %s\n", $mysqli->error);

【讨论】:

【参考方案4】:

这些对我有用:

在 HTML 标头中:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

php连接后:

$conexion = @mysql_connect($servidor, $usuario, $contrasenha);
mysql_select_db($BD, $conexion) or die(mysql_error($conexion));
mysql_query("SET NAMES 'utf8'");

【讨论】:

【参考方案5】:

这篇文章解释了如何在 PHP 和 MySQL 中配置和使用 UTF-8。 希望能节省您的时间。

A UTF-8 Primer for PHP and MySQL

【讨论】:

【参考方案6】:

在代码中每次连接之前不要打扰SET NAMES,可以使用mysql连接字符串中的参数:

"jdbc:mysql://hostAddress:port/databaseName?characterEncoding=UTF-8"

【讨论】:

【参考方案7】:

在使用 DB 之前尝试设置客户端编码。

mysql_query("SET NAMES 'utf8'");

如果上述方法不起作用,请使用 utf8 编码/解码函数:

<?
$string ="Étuit";
?>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<?
echo $string; // echo's '?tuit'
echo utf8_encode($string); // echo's 'Étuit'
?>

【讨论】:

要么。如果您将所有内容都设置为 UTF-8,则不需要 utf8_encode。你知道这个函数实际上是做什么的吗? deceze :它将字符串编码为 utf8。您在个人资料上的照片不错;) 但是字符串已经用UTF-8编码了,至少它应该是!当您在我的个人资料中时,请点击查看我写的关于编码的长篇大论文章,该文章对此进行了更详细的介绍。 @deceze 你把这个功能太个人化了,给人的印象是所有正义的反对票。 对于初学者,不要再如此居高临下。而不是“......你知道这个函数实际上是做什么的吗?”你可以说“根据 PHP 文档,这个函数实际上......你可以复制这种行为......”【参考方案8】:

可能发生的情况是客户端的默认字符集未设置为 UTF-8,因此您在一个方向或另一个方向上进行换位。这有多种不同的方式here:

通常,在连接被实例化之后对“SET NAMES utf8”的初始化查询将解决未来的问题,但请确保您认为存储的内容(utf8)实际上是存储的内容。如果没有,您可能需要进行清理工作。

【讨论】:

这里的问题是,所有的答案都很好,很难找到最好的答案。我使用 Doctrine ,没有必要在 mysql_query 上应用 Set Name。也感谢您的帮助 Jean-Francois,您可能想返回并编辑您的问题以表明涉及 Doctrine。这将是有用的信息。您是否使用 $manager->setCharset('utf8'); 配置连接?很高兴知道这最终是如何处理的,以供将来参考。 正如@gview 的link 中的指南所建议的那样,设置html 表单属性“
”为我解决了OP 的问题。

以上是关于PHP 和 Mysql UTF-8(特殊字符)的问题的主要内容,如果未能解决你的问题,请参考以下文章

UTF-8 中的特殊字符在 MYSQL 中使用 magento 存储为带问号的菱形

PHP/HTML 中的所有特殊字符都是问号

使用 UTF-8 编码,具有特殊属性/外来字符的 CSV 文件在导入 MySQL (phpMyAdmin) 时不保留

PHP 替换 à->a、è->e 等特殊字符

php mysql转义特殊字符的函数都有哪些

无法使用php显示mysql数据库中的特殊字符