MySQL到JSON:在UTF-8中编码德语特殊字符的问题

时间:2014-09-05 19:44:40

标签: php mysql json encoding utf-8

我编写了一个小脚本,它从MySQL表中获取数据并将其放入JSON数组中。但是,即使我在任何地方设置了UTF-8,也存在字符编码问题。这是脚本:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>JSON</title>
</head>

<?php

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

$con = mysqli_connect("HOST", "USERNAME", "PASSWORD", "DATABASE");
if (!$con) {
    trigger_error('Could not connect to MySQL: ' . mysqli_connect_error());
}

mysqli_set_charset($con,"utf8");

mysql_query("SET NAMES SET 'utf8'"); 
mysql_query("SET character_set_client = 'utf8'"); 
mysql_query("SET character_set_connection = 'utf8'"); 
mysql_query("SET character_set_results = 'utf8'");

$sql = "SELECT * FROM table";

$result = mysqli_query($con, $sql);

$rows = array();
while($r = mysqli_fetch_assoc($result)) {
    $rows[]=$r;
}

print json_encode($rows);


mysqli_close($con);

?>

</html>

在输出中,我得到值“\ u00e4”而不是“ä”。

其他一些信息:

  • 表格在utf8_general_ci中(与其所有列一样)
  • PHP文档采用UTF8

我做错了什么? 谢谢你的帮助!!

1 个答案:

答案 0 :(得分:0)

在我看来一切正常。您看到\u00e4而不是ä的原因是因为JSON序列化程序的实现。串行器正在做什么是完全有效的。

来自JSON RFC Section 2.5 Strings

  

任何角色都可能被转义。如果角色在基本   多语言平面(U + 0000到U + FFFF),然后它可能是   表示为六个字符的序列:反向固相,然后   用小写字母u,后跟四个十六进制数字   编码字符的代码点。十六进制字母A虽然   F可以是大写或小写。所以,例如,一个包含的字符串   只有一个反向固相字符可以表示为   &#34; \ u005C&#34;

我怀疑为什么这个序列化程序为你逃脱它的原因是因为PHP doesn't natively support unicode

  

字符串是一系列字符,其中一个字符与a相同   字节。   这意味着PHP仅支持256个字符集,因此不支持   提供原生Unicode支持。