在php中,json_encode()
将在十六进制实体中编码UTF8,例如
json_encode('中'); // become "\u4e2d"
假设数据" \ u4e2d"现在存储在MySQL中,是否可以在不使用PHP的情况下从"\u4e2d"
转换回中
,只是简单的MySQL?
答案 0 :(得分:1)
在我的配置中,选择十六进制('中');返回E4B8AD 这是UTF8字节的十六进制代码。当然,它 与代码点4e2d的十六进制不同,但是你可以得到 用select hex(cast('中' as char(1)字符集utf16));.
更新:提问者编辑了这个问题,看起来像是一个完全不同的问题,现在它显然是:如何获得'中'给出一个包含' \ u4e2d'的字符串当4e2d是中的代码点时,默认字符集是utf8。好的,就是这样 选择cast(char(conv(右(' \ u4e2d',4),16,10)使用utf16)作为char(1)字符集utf8);
答案 1 :(得分:0)
将非ASCII字符编码为JavaScript实体只是JSON编码器所做的不同事情之一 - 而且它实际上并不是强制性的:
echo json_encode('中'), PHP_EOL;
echo json_encode('中', JSON_UNESCAPED_UNICODE), PHP_EOL;
echo json_encode('One "Two" Three \中'), PHP_EOL;
"\u4e2d"
"中"
"One \"Two\" Three \\\u4e2d"
因此,唯一安全的解码方法是使用专用的JSON解码器。 MySQL捆绑了自5.7.8以来所需的能力:
SET @input = '"One \\"Two\\" Three \\\\\\u4e2d"';
SELECT @input AS json_string, JSON_UNQUOTE(@input) AS original_string;
json_string original_string
============================ ===================
"One \"Two\" Three \\\u4e2d" One "Two" Three \中
(Demo)
如果您使用的是旧版本,则必须采用更精细的解决方案(Google可以使用第三方UDF)。
无论如何,我建议你回到设计表。奇怪的是,在没有合适的JSON解码器的情况下,您需要JSON数据。