Html 是否存在localStorage中不允许的字符?
我一直在使用localStorage以字符串格式存储一些二进制数据,尽管该值已明确设置(Html 是否存在localStorage中不允许的字符?,html,local-storage,binary-data,Html,Local Storage,Binary Data,我一直在使用localStorage以字符串格式存储一些二进制数据,尽管该值已明确设置(alert在设置后立即调用它,甚至在设置后一段时间,显示正确的值),但在下次加载页面时,该值会丢失 起初我认为这可能是因为数据包含空字节,所以我重新设计了压缩器,使其永远不会输出它们。但是,这没有什么区别,因为值仍然丢失 我在设置二进制数据后立即添加了localStorage.testing=1。即使另一个值丢失,也会保留该值 我绝对肯定没有代码可以删除localStorage.myitem 是什么导致了这个
alert
在设置后立即调用它,甚至在设置后一段时间,显示正确的值),但在下次加载页面时,该值会丢失
起初我认为这可能是因为数据包含空字节,所以我重新设计了压缩器,使其永远不会输出它们。但是,这没有什么区别,因为值仍然丢失
我在设置二进制数据后立即添加了localStorage.testing=1
。即使另一个值丢失,也会保留该值
我绝对肯定没有代码可以删除localStorage.myitem
是什么导致了这个问题
如果有帮助,以下是我试图存储的数据,十六进制:
0x1103c0a0 0xd6cf0305 0xc0a0d6cf 0x0307c0a0 0xd6cf0309 0xc0a0d6cf
0x030bc0a0 0xd6cf030d 0xc0a0d6cf 0x0311c0a0 0xd6cf0313 0xc0a0d6cf 0x0301
编辑:我刚刚用
localStorage.testvalue=realvalue.replace(/[\x00-\x1f]/g',)进行了测试代码>并成功保存了它。所以,我想知道规范在哪里规定控制字符不能在字符串中使用。经过进一步测试,当localStorage说它存储字符串时,它的真正含义是存储匹配的字符串:
/^[\x00\x09\x0A\x0D\x20-\xff]*$/
所以在空间之前不允许任何东西,除了HT,CR,LF和NUL
也就是说,仍然不知道为什么。我已经设置了一个,并在各种浏览器中运行了测试。结果如下(提到了字符代码的包含范围)。测试以支持localStorage
的最低浏览器版本开始
- Chrome 5-20:
0x0000
-0xFFFF
- 歌剧10.50-12.00:
0x0000
-0xFFFF
- Safari 4.0-5.1.7:
0x0000
-0xFFFF
- Firefox 3.5-16alpha:
0x0000
-0xD7FF
和0xE000
-0xFFFE
(0xD800-0xDFFF和0xFFFF在LS后以两个字符显示)
- IE8、IE9、IE10PP6:
0x0009
,0x000A
,0x000D
,0x0020
-0xD7FF
和0xE000
-0xFFFD
。(其他范围被忽略或导致“无效参数”错误)。
0x0000
是一个空字节,它截断IE中的所有以下字符
因此,字符范围0x20
-0xD7FF
和0xE000
-0xFFFD
加上0x09
,0x0A
和0x0D
是安全的。
我创建了三个测试用例:
最快的测试用例,它创建一个包含所有字符的字符串,并在设置localStorage
一种使用空格字符(0x20)作为分隔符的方法,用于正确处理创建长度为2的字符的浏览器
最糟糕的方法,因为IE对无效字符串抛出错误。每个字符都要单独测试,这相当昂贵
所有测试功能都在中可用,第一个测试用例如下所示:
function run_test(lowerlimit, UPPERLIMIT) {
try {
if (!window.localStorage) {
// I recall that in one of the older Chrome version (4),
// localStorage === null
return 'Localstorage is not supported';
}
if (isNaN(lowerlimit) || isNaN(UPPERLIMIT) || lowerlimit > UPPERLIMIT) {
return 'One of the limits is not a valid number!';
}
var i = lowerlimit - 1;
var character_range = [];
while (++i < UPPERLIMIT) character_range.push(i);
input = String.fromCharCode.apply(String, character_range);
localStorage.setItem('chartest', input);
output = localStorage.getItem('chartest');
if (input === output) {
return true;
}
// Uh oh, not equal!
var result = [];
for (i=0; i<UPPERLIMIT-lowerlimit; i++) {
if (input[i] !== output[i]) {
result.push(i + lowerlimit);
}
}
return result;
}catch(e){return 'Error:' + e;}
}
函数运行测试(下限、上限){
试一试{
如果(!window.localStorage){
//我记得在一个较旧的Chrome版本(4)中,
//localStorage==null
返回“不支持本地存储”;
}
如果(isNaN(下限)| | isNaN(上限)| | lowerlimit>上限){
返回“其中一个限制不是有效数字!”;
}
var i=下限-1;
变量字符_范围=[];
而(++i<上限)字符_范围.push(i);
输入=String.fromCharCode.apply(字符串,字符范围);
setItem('chartest',输入);
output=localStorage.getItem('chartest');
如果(输入==输出){
返回true;
}
//哦,不平等!
var结果=[];
对于(i=0;iIs,是针对多个浏览器还是仅针对一个浏览器进行测试?您可能只在IE中进行了测试,因为我也在其他浏览器中创建并测试了该功能,显示了不同的结果(请参见其他答案)。Javascript使用UTF-16。您的正则表达式仅限于ASCII。