假設(shè)有這么一個(gè)URL
```
$url = "https://www.baidu.com?key=你好";
$data = ["url" => $url];
echo json_encode($data);
```
得到這樣的輸出
```
{"url":"https:\/\/www.baidu.com?key=\u4f60\u597d"}
```
首先發(fā)現(xiàn)中文經(jīng)過(guò)encode之后變成了16進(jìn)制卓鹿,這不是亂碼,只是單純現(xiàn)實(shí)方法變了留荔,因?yàn)橹恍枰苯油ㄟ^(guò)反序列化就能得到原結(jié)果吟孙,如下:
```
//代碼
$jsonStr = '{"url":"https:\/\/www.baidu.com?key=\u4f60\u597d"}';
$data = json_decode($jsonStr);
print_r($data);
//輸出
stdClass Object
(
? ? [url] => https://www.baidu.com?key=你好
)
```
可見(jiàn)這不是亂碼,那么接下來(lái)說(shuō)一說(shuō)正題存谎,雖然不是亂碼拔疚,但是看著16進(jìn)制總是影響閱讀
可以在`json_encode`加一個(gè)參數(shù)
```
//代碼
$url = "https://www.baidu.com?key=你好";
$data = ["url" => $url];
echo json_encode($data, JSON_UNESCAPED_UNICODE);
//輸出
{"url":"https:\/\/www.baidu.com?key=你好"}
```
發(fā)現(xiàn)中文可以正常顯示了,但是還有一個(gè)問(wèn)題就是反斜杠被自動(dòng)加了轉(zhuǎn)義字符`\`
看著也挺難受的既荚,有沒(méi)有方法可以把轉(zhuǎn)義符去掉
```
//代碼
$url = "https://www.baidu.com?key=你好";
$data = ["url" => $url];
echo json_encode($data, JSON_UNESCAPED_SLASHES);
//輸出
{"url":"https://www.baidu.com?key=\u4f60\u597d"}
```
現(xiàn)在轉(zhuǎn)義符去掉了稚失,但是中文又變成16進(jìn)制了,我想既去掉轉(zhuǎn)義符恰聘,又正常顯示中文怎么辦
受到*nix-like權(quán)限管理的啟發(fā)句各,發(fā)現(xiàn)可以用異或運(yùn)算
```
//代碼
$url = "https://www.baidu.com?key=你好";
$data = ["url" => $url];
echo json_encode($data, JSON_UNESCAPED_UNICODE ^ JSON_UNESCAPED_SLASHES);
//輸出
{"url":"https://www.baidu.com?key=你好"}
```
完事。
另外補(bǔ)充一下晴叨,
因?yàn)閌JSON_UNESCAPED_UNICODE`|`JSON_UNESCAPED_SLASHES`這幾個(gè)值的特殊性凿宾,因?yàn)槎际峭ㄟ^(guò)`1 << n (n為一個(gè)整數(shù))`得到的,所以不僅可以用異或運(yùn)算兼蕊,也可以直接使用加法
```
//該等式為true
((1<<1) ^ (1<<2)) ===?((1<<1) + (1<<2))
```