2013-02-20 117 views
8
$test = json_encode('بسم الله'); 
echo $test; 

作为此代码的结果,输出结果为:"\u0628\u0633\u0645 \u0627\u0644\u0644\u0647",而它应该是“بسمالله”。阿拉伯字符在JSON编码时编码,而在Youtube API时编码不是这样: http://gdata.youtube.com/feeds/api/videos/RqMxTnTZeNE?v=2&alt=jsonJSON解码中的阿拉伯字符

您可以在Youtube上看到阿拉伯字符显示正确。可能是我的错误?

提示:我正在研究API <该示例仅用于说明。

+3

可以显示阿拉伯字符,而不使用json_encode,那么为什么你想尝试json_encode这些字符? – haitaka 2013-02-20 12:59:26

+0

使用谷歌输入工具阿拉伯文 – 2013-02-20 13:00:03

+0

我正在使用API​​,这就是为什么我试图json_encode – 2013-02-20 13:00:47

回答

20

"\u0628\u0633\u0645 \u0627\u0644\u0644\u0647""بسم الله"在JSON中是等效的。

PHP只是默认使用Unicode转义代替多字节字符的文字。

您可以用JSON_UNESCAPED_UNICODE(假设您使用PHP 5.4或更高版本)指定。

json_encode('بسم الله', JSON_UNESCAPED_UNICODE); 
+1

工作得很好。 – 2013-02-20 13:08:26

+0

我的主机还不支持PHP 5.4! 谢谢:) – 2013-02-20 13:14:04

+0

太棒了!那工作。 – 2016-11-18 18:01:30

2

这是UTF-8字符串的正确JSON编码版本。没有必要改变它,它代表了正确的字符串。 JSON中的字符可以通过这种方式逃脱。

JSON 可以直接代表UTF-8字符,如果你想。自PHP 5.4,你必须设置JSON_UNESCAPED_UNICODE标志生产原料UTF-8字符串的选项:

json_encode($string, JSON_UNESCAPED_UNICODE) 

不过,这只是一个偏好,这是没有必要的。

2

两种格式都有效,相当于JSON字符串:

char 
    any-Unicode-character- 
     except-"-or-\-or- 
     control-character 
    \" 
    \\ 
    \/ 
    \b 
    \f 
    \n 
    \r 
    \t 
    \u four-hex-digits 

如果你喜欢的未编码版本,只需添加JSON_UNESCAPED_UNICODE标志:

<?php 

$test = json_encode('بسم الله', JSON_UNESCAPED_UNICODE); 
echo $test; 

该标志需要PHP/5.4 .0或更高。

2

那么,正如前面提到的那样没关系,因为两个字符串都是等价的。 但是你应该做的是确保编码后的字符串在发送到输出前被解码。

echo json_decode($test); 

还是因为JSON包含最有可能不仅仅是一个字符串更多:

$obj['arabic'] = 'بسم الله'; 
$obj['latin'] = 'abcdef'; 
$obj['integer'] = 12345; 

$test = json_encode($obj); 

$testobject = json_decode($test); 
echo $testobject['arabic'];