php json_encode utf8 char问题(mysql)[重复]

Posted

技术标签:

【中文标题】php json_encode utf8 char问题(mysql)[重复]【英文标题】:php json_encode utf8 char problem ( mysql ) [duplicate] 【发布时间】: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:不,可以这样使用 【参考方案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 编码避免了反斜杠(或其他特殊字符)的任何问题

以上是关于php json_encode utf8 char问题(mysql)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHP中json_encode与json_decode

PHP json_encode json_decode UTF-8

对数组内容使用了json_encode返回汉字内容返回了空值

php 重要函数归集

PHP JSON_ENCODE使用后中文变成百分号乱码了

如何将php shell的exec输出转换为utf8