2014-09-05 48 views
1

我写了一个小脚本,它从MySQL表中获取数据并将其放入JSON数组中。但是,字符编码存在一个问题,即使我在任何地方都设置了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

我在做什么错? 感谢您的帮助!

+0

尝试[this](http://php.net/manual/de/mysqli.set-charset.php) – Jens 2014-09-05 19:51:36

回答

0

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

JSON RFC Section 2.5 Strings

任何字符可以被转义。如果字符在多语言平面(U + 0000到U + FFFF)中,则它可能是 ,表示为六个字符的序列:反斜线, 后跟小写字母u,后跟四个十六进制数字 对字符的代码点进行编码。十六进制字母A虽然 F可以是大写或小写。因此,例如,包含 的字符串只有一个反向固体角色字符可以表示为 “\ u005C”。

我怀疑为什么这个串行器为你逃脱它的原因是因为PHP doesn't natively support unicode

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

+0

谢谢你的帮助,马修! – Laurent 2014-09-07 09:09:28