PHP使用json_encode函数时不转义中文的解决方法_php技巧
May 16, 2016 pm 08:32 PM
php
中国語
逃げる
本文实例讲述了PHP使用json_encode函数时不转义中文的解决方法。分享给大家供大家参考。具体方法如下:
json_encode函数对于gbk中的中文字符是不会转换的或直接转换成空格了,本文就来给各位整理一个关于json不转义中文问题处理技巧,相信对大家有所帮助。
如果你调用 PHP 自带的 json_encode() 函数, 碰到中文时, 中文会被转义掉. 例如:
复制代码 代码如下:
echo json_encode(array('你好'));
// 输出: ["\u4f60\u597d"]
// 输出: ["\u4f60\u597d"]
这非常恼人, 像是一堆乱码, JSON 标准从来没有说要把非 ASCII 字符转义, 标准说的是”Any UNICODE character”.
如何禁用掉这种转义呢? 答案是, PHP 自带的 json_encode() 不能禁用这个特性(在 5.4.0 版本之前, 之后的版本你可以加 JSON_UNESCAPED_UNICODE 选项), 你只能换一个新的 JSON 库. 为了简单, 我简单写了几十行代码, 实现一个 json_encode().
复制代码 代码如下:
class Util
{
static function json_encode($input){
// 从 PHP 5.4.0 起, 增加了这个选项.
if(defined('JSON_UNESCAPED_UNICODE')){
return json_encode($input, JSON_UNESCAPED_UNICODE);
}
if(is_string($input)){
$text = $input;
$text = str_replace('\\', '\\\\', $text);
$text = str_replace(
array("\r", "\n", "\t", "\""),
array('\r', '\n', '\t', '\\"'),
$text);
return '"' . $text . '"';
}else if(is_array($input) || is_object($input)){
$arr = array();
$is_obj = is_object($input) || (array_keys($input) !== range(0, count($input) - 1));
foreach($input as $k=>$v){
if($is_obj){
$arr[] = self::json_encode($k) . ':' . self::json_encode($v);
}else{
$arr[] = self::json_encode($v);
}
}
if($is_obj){
return '{' . join(',', $arr) . '}';
}else{
return '[' . join(',', $arr) . ']';
}
}else{
return $input . '';
}
}
}
{
static function json_encode($input){
// 从 PHP 5.4.0 起, 增加了这个选项.
if(defined('JSON_UNESCAPED_UNICODE')){
return json_encode($input, JSON_UNESCAPED_UNICODE);
}
if(is_string($input)){
$text = $input;
$text = str_replace('\\', '\\\\', $text);
$text = str_replace(
array("\r", "\n", "\t", "\""),
array('\r', '\n', '\t', '\\"'),
$text);
return '"' . $text . '"';
}else if(is_array($input) || is_object($input)){
$arr = array();
$is_obj = is_object($input) || (array_keys($input) !== range(0, count($input) - 1));
foreach($input as $k=>$v){
if($is_obj){
$arr[] = self::json_encode($k) . ':' . self::json_encode($v);
}else{
$arr[] = self::json_encode($v);
}
}
if($is_obj){
return '{' . join(',', $arr) . '}';
}else{
return '[' . join(',', $arr) . ']';
}
}else{
return $input . '';
}
}
}
考虑不到的地方, 例如判断关联数组(is_obj)的地方, 遇到问题再说. 你要是不喜欢类, 那就自己转成纯函数, 换个名字吧。
希望本文所述对大家的PHP程序设计有所帮助。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

人気の記事
レポ:チームメイトを復活させる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
スプリットフィクションを打ち負かすのにどれくらい時間がかかりますか?
3週間前
By DDD
ハローキティアイランドアドベンチャー:巨大な種を手に入れる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.説明されたエネルギー結晶と彼らが何をするか(黄色のクリスタル)
1週間前
By 尊渡假赌尊渡假赌尊渡假赌

人気の記事
レポ:チームメイトを復活させる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
スプリットフィクションを打ち負かすのにどれくらい時間がかかりますか?
3週間前
By DDD
ハローキティアイランドアドベンチャー:巨大な種を手に入れる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.説明されたエネルギー結晶と彼らが何をするか(黄色のクリスタル)
1週間前
By 尊渡假赌尊渡假赌尊渡假赌

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック
Gmailメールのログイン入り口はどこですか?
7287
9


Java チュートリアル
1622
14


CakePHP チュートリアル
1342
46


Laravel チュートリアル
1259
25


PHP チュートリアル
1206
29



Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法
