从UTF-16字符串中获取意外的EOF

时间:2015-06-27 14:34:01

标签: javascript utf-16

我正在使用LZstring对字符串执行UTF-16压缩并将其存储在数据库中。具体来说,它是存储在cordova.sqllite db中的JSON.stringify d数据。当我从db检索数据时,有时会导致 SyntaxError:Unexpected EOF

我认为根据输入,LZString的compressToUTF16函数会产生无效字符。奇怪的是,它被正确地存储在DB中(存储到DB中时没有意外的EOF错误)。

存储普通字符串或compressToBase64'字符串不会导致错误,因此我认为这不是DB的问题。

1 个答案:

答案 0 :(得分:0)

显然,LZString的UTF16压缩有时会生成\u2028\u2029个字符,这些字符被解析器视为换行符(有关详细信息,请参阅here)。我在压缩之后和存储之前,检索之后和​​解压缩之前替换了所有出现的两个unicode,以解决问题。

储存前

var dbvalue = LZString.compressToUTF16(JSON.stringify(value));
dbvalue = dbvalue.replace(/\u2028/g, '\u32800').replace(/\u2029/g, '\u32801');
检索后

var utfdata = dbvalue.replace(/\u32800/g,'\u2028').replace(/\u32801/g,'\u2029');
var value = JSON.parse(LZString.decompressFromUTF16(utfdata));

<强> EDITED
LZString不使用替换字符,占用的空间更少。有关详细信息,请参阅here