【问题标题】:Problem json_encode utf-8 [duplicate]问题 json_encode utf-8 [重复]
【发布时间】:2026-01-30 23:15:01
【问题描述】:

我对带有特殊字符的 json_encode 函数有疑问。

例如我试试这个:

$string="Svrček";

echo "ENCODING=".mb_detect_encoding($string); //ENCODING=UTF-8

echo "JSON=".json_encode($string); //JSON="Svr\u010dek"

我该怎么做才能正确显示字符串,所以 JSON="Svrček"?

非常感谢。

【问题讨论】:

  • 这是什么语言的?我认为是 Perl,但我想也许是 PHP?
  • "Svr\u010dek" 等价于"Svrček" (UTF-8)。

标签: php utf-8 character-encoding json


【解决方案1】:

json_encode() 实际上并没有在那里输出JSON*。它正在输出一个 javascript 字符串。 (当你给它一个对象或一个数组来编码时,它会输出 JSON。)这很好,因为你想要一个 javascript 字符串。

在 javascript(和 JSON)中,č 可以转义为 \u010d。两者是等价的。所以json_encode() 所做的事情并没有错。它应该可以正常工作。如果这实际上给您带来任何形式的问题,我会感到非常惊讶。但是,如果传输安全地采用 Unicode 编码(通常为 UTF-8)†,则也不需要它。如果你想关闭转义,你可以这样做:json_encode('Svrček', JSON_UNESCAPED_UNICODE)。请注意,JSON_UNESCAPED_UNICODE 标志是在 PHP 5.4.0 中引入的,在早期版本中不可用。

顺便说一句,与@onteria_ 所说的相反,JSON does use UTF-8

JSON 文本的字符编码始终为 Unicode。 UTF-8 是唯一在网络上有意义的编码,但也允许使用 UTF-16 和 UTF-32。


* 或者,至少,它不输出 RFC 4627 中定义的 JSON。但是,有other definitions of JSON,由scalar values are allowed

† JSON 可能采用 UTF-8、UTF-16LE、UTF-16BE、UFT-32LE 或 UTF-32BE。

【讨论】:

  • +1 表示 JSON_UNESCAPED_UNICODE
  • 5.2 的替代品是什么
  • 你真的需要JSON_UNESCAPED_UNICODE,@MuhammadBabar吗?如果您不使用 UTF-8,则您不会想要它。如果您使用的是 UTF-8,您仍然不需要它:使用它会使您的输出稍微变小,仅此而已。
  • 是的,我需要它,我正在使用 UTF-8。问题是关于转义 unicode 以返回实际的聊天对象。虽然我确实找到了解决方案。谢谢和欢呼
  • 请注意,json_encode 不会发出转义的 Unicode 代码点。例如json_encode('Hello José ?") 产生可怕的"Hello Jos\u00e9 \ud83d\ude31"。 U+D83D 和 U+DE31 不是合法的 Unicode 代码点。所以它发出了可怕的、可怕的 UTF-16 代码单元。它错误地将逻辑代码点与物理编码布局混淆,在 Java、C# 和 Windows 等地方一次又一次地看到抽象违规。
【解决方案2】:

好的,所以,在你的 php 脚本中建立数据库连接后,输入这一行,它应该可以工作,至少它解决了我的问题:

mysql_query('SET CHARACTER SET utf8');

【讨论】:

    【解决方案3】:

    是的,json_encode 转义非 ascii 字符。如果你解码它,你会得到你的原始结果:

    $string="こんにちは";
    echo "ENCODING: " . mb_detect_encoding($string) . "\n";
    $encoded = json_encode($string);
    echo "ENCODED JSON: $encoded\n";
    $decoded = json_decode($encoded);
    echo "DECODED JSON: $decoded\n";
    

    输出:

    ENCODING: UTF-8
    ENCODED JSON: "\u3053\u3093\u306b\u3061\u306f"
    DECODED JSON: こんにちは
    

    编辑:一文不值:

    JSON 专门使用 Unicode。

    自我记录的格式 将结构和字段名称描述为 以及具体的价值观;

    来源:http://www.json.org/fatfree.html

    它使用 Unicode NOT UTF-8。此常见问题解答解释了 UTF-8 和 Unicode 之间的区别:

    http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8

    您使用 JSON,您的非 ascii 字符会转义为 Unicode 代码点。例如こ = code point 3053

    【讨论】: