19
$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=json

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

提示:我正在开发一个 API< 这个例子只是为了澄清。

4

4 回答 4

37

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

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

您可以使用JSON_UNESCAPED_UNICODE指定其他方式(前提是您使用的是 PHP 5.4 或更高版本)。

json_encode('بسم الله', JSON_UNESCAPED_UNICODE);
于 2013-02-20T13:04:29.970 回答
2

那是 UTF-8 字符串的正确 JSON 编码版本。无需更改,它代表正确的字符串。JSON 中的字符可以通过这种方式进行转义。

如果您愿意,JSON可以直接表示 UTF-8 字符。从 PHP 5.4 开始,您可以选择设置JSON_UNESCAPED_UNICODE标志以生成原始 UTF-8 字符串:

json_encode($string, JSON_UNESCAPED_UNICODE)

但这只是一种偏好,没有必要。

于 2013-02-20T13:05:47.813 回答
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 或更高版本。

于 2013-02-20T13:06:31.547 回答
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'];
于 2013-02-20T13:37:08.260 回答