如何将Curl获取的JSON中转义HTML还原后存入SQL Server?
解决SQL Server中HTML标签被Unicode转义的问题
核心原因
你遇到的是JSON转义后的Unicode编码(比如\u003cul\u003e对应<ul>)被存入数据库,需要还原成原始HTML标签。这种情况通常是数据插入前未完成正确的Unicode解析,或是被二次转义导致的。
恢复方法
PHP代码层面处理
因为你用了json_decode,可以利用JSON解析器自带的Unicode转义还原能力:
// 假设从数据库取出的转义字符串为 $escaped_html $original_html = json_decode('"' . $escaped_html . '"');
如果字符串中包含双引号,需要先转义:
$escaped_html = str_replace('"', '\\"', $escaped_html); $original_html = json_decode('"' . $escaped_html . '"');
也可以用正则替换直接解析Unicode编码:
$original_html = preg_replace('/\\\\u([0-9a-fA-F]{4})/', function($match) { return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE'); }, $escaped_html);
SQL Server数据库层面处理
如果不想修改应用代码,可以创建自定义函数批量还原:
CREATE FUNCTION dbo.UniDecode(@input NVARCHAR(MAX)) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @output NVARCHAR(MAX) = @input; DECLARE @pos INT = CHARINDEX('\u', @output); WHILE @pos > 0 BEGIN DECLARE @code NVARCHAR(4) = SUBSTRING(@output, @pos + 2, 4); DECLARE @char NCHAR(1) = NCHAR(CONVERT(INT, @code, 16)); SET @output = STUFF(@output, @pos, 6, @char); SET @pos = CHARINDEX('\u', @output); END RETURN @output; END
使用时直接调用函数:
SELECT dbo.UniDecode(your_html_column) AS original_html FROM your_table;
避免后续重复出现
- 插入前确认
json_decode已正确解析:默认json_decode会自动将Unicode转义转换为对应字符,检查插入数据库前的变量是否为原始HTML。 - 使用参数化查询:用PDO或sqlsrv的参数绑定插入数据,避免驱动自动转义特殊字符。
- 数据库字段类型选
NVARCHAR(MAX):确保字段支持存储任意长度的UTF-8文本,不要使用会自动转义的字段类型。
内容的提问来源于stack exchange,提问作者Stefano Coccia
相关产品推荐
相关产品推荐

