Changeset

8697:c60fdf148118

util.json: Unescape surrogate pairs
author Matthew Wild <mwild1@gmail.com>
date Tue, 27 Mar 2018 13:44:40 +0100
parents 8696:164da3186511
children 8698:0499f3da0ec4
files util/json.lua
diffstat 1 files changed, 5 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/util/json.lua	Sun Mar 25 23:30:14 2018 +0200
+++ b/util/json.lua	Tue Mar 27 13:44:40 2018 +0100
@@ -246,7 +246,7 @@
 	end
 end
 local _unescape_error;
-local function _unescape_surrogate_func(x) -- luacheck: ignore
+local function _unescape_surrogate_func(x)
 	local lead, trail = tonumber(x:sub(3, 6), 16), tonumber(x:sub(9, 12), 16);
 	local codepoint = lead * 0x400 + trail - 0x35FDC00;
 	local a = codepoint % 64;
@@ -260,8 +260,9 @@
 local function _unescape_func(x)
 	x = x:match("%x%x%x%x", 3);
 	if x then
-		--if x >= 0xD800 and x <= 0xDFFF then _unescape_error = true; end -- bad surrogate pair
-		return codepoint_to_utf8(tonumber(x, 16));
+		local codepoint = tonumber(x, 16)
+		if codepoint >= 0xD800 and codepoint <= 0xDFFF then _unescape_error = true; end -- bad surrogate pair
+		return codepoint_to_utf8(codepoint);
 	end
 	_unescape_error = true;
 end
@@ -273,7 +274,7 @@
 		--if s:find("[%z-\31]") then return nil, "control char in string"; end
 		-- FIXME handle control characters
 		_unescape_error = nil;
-		--s = s:gsub("\\u[dD][89abAB]%x%x\\u[dD][cdefCDEF]%x%x", _unescape_surrogate_func);
+		s = s:gsub("\\u[dD][89abAB]%x%x\\u[dD][cdefCDEF]%x%x", _unescape_surrogate_func);
 		-- FIXME handle escapes beyond BMP
 		s = s:gsub("\\u.?.?.?.?", _unescape_func);
 		if _unescape_error then return nil, "invalid escape"; end