【问题标题】:php json_encode utf8 char problem ( mysql ) [duplicate]php json_encode utf8 char问题(mysql)[重复]
【发布时间】:2011-06-14 12:23:55
【问题描述】:

我正在使用 jQuery json_encode 以表单的数据形式写入数据库。

但是,数据库中的数据会损坏。

$db->query("SET NAMES utf8");

$kelime = array("Merhaba","Dünya");
$bilgi = json_encode($kelime);

$incelemeEkle = "
INSERT INTO incelemeRapor SET
bigData = '".$bilgi."'
";
$db->query($incelemeEkle);

数据库表架构;

CREATE TABLE `incelemeRapor` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `bigData` text COLLATE utf8_unicode_ci,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

MySQL 插入的示例数据;

["Merhaba","Du00fcnya"]

【问题讨论】:

  • 实际的PHP文件保存为什么编码?
  • 根据 MySQL 文档,当使用 SET NAMES 时,字符集用引号括起来,您似乎没有,因此您可能实际上没有设置 utf8。
  • @Jamie Taniguchi:不,可以这样使用

标签: php mysql utf-8 json


【解决方案1】:

始终在将数据放入 SQL 查询之前对其进行转义:

$incelemeEkle = "
INSERT INTO incelemeRapor SET
bigData = '".mysql_real_escape_string($bilgi)."'
";

(已添加mysql_real_escape_string() 通话)

json_encode() 使用\u<code-point> 表示法编码非ascii 字符;所以json_encode(array("Merhaba","Dünya")); 返回["Merhaba","D\u00fcnya"]

然后这个字符串被嵌入到一个 SQL 查询中:

INSERT INTO incelemeRapor SET
bigData = '["Merhaba","D\u00fcnya"]'

转义序列\u没有特殊含义,所以MySQL只是去掉了\;这导致["Merhaba","Du00fcnya"] 被存储在数据库中。

所以如果你对字符串进行转义,查询变为:

$incelemeEkle = "
INSERT INTO incelemeRapor SET
bigData = '["Merhaba","D\\u00fcnya"]'
";

并且["Merhaba","D\u00fcnya"]存储在数据库中。

【讨论】:

    【解决方案2】:

    我尝试使用 mysql_real_escape_string() 但对我不起作用(导致数据库中的字段为空)。

    所以我看这里:http://php.net/manual/fr/json.constants.php 和标志 JSON_UNESCAPED_UNICODE 对我很有效:

    $json_data = json_encode($data,JSON_UNESCAPED_UNICODE);
    

    JSON_UNESCAPED_UNICODE 仅从 PHP 5.4.0 起可用!

    【讨论】:

      【解决方案3】:

      因此,除了确保您的数据库使用 utf8_unicode_ci 之外,您还需要确保 PHP 使用正确的编码。通常,我在任何可能包含外来字符的函数的顶部运行以下两个命令。更好的是在您的应用启动时将其作为第一个命令之一运行:

      mb_language('uni');
      mb_internal_encoding('UTF-8');
      

      这两行让我头疼不已!

      【讨论】:

        【解决方案4】:

        就像 user576875 所说,您只需要在将字符串插入数据库之前正确处理它。 mysql_real_escape_string() 是一种方法。准备好的语句是另一种方式。如果您将用户输入直接写入 SQL,这也将使您免受 SQL 注入安全问题的影响。始终使用上述两种方法之一。

        另外,请注意,这与 UTF8 关系不大。 JSON 是 ASCII 安全的,因此只要您使用类似 ASCII 的字符集(utf8、iso-8859-1),数据就会被正确插入和存储。

        【讨论】:

          【解决方案5】:

          我会将 BASE64 编码应用于 JSON 字符串。这应该适用于几乎所有 php 设置、数据库、数据库版本和设置:

          $values = array("Test" => 1, "the" => 2, "West" => 3);
          $encoded = base64_encode(json_encode($values));
          $decoded = json_decode(base64_decode($encoded), true);
          

          【讨论】:

          • 您不需要对 JSON 进行 base64 编码。它是 ASCII 安全的。只有 7 位字符。
          • 你是对的。但是 base64 编码避免了反斜杠(或其他特殊字符)的任何问题
          猜你喜欢
          • 2012-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-27
          • 2011-08-28
          • 2017-03-17
          • 1970-01-01
          相关资源
          最近更新 更多