最近我遇到了一个bug,因为浏览器支持的数据质量,我正在寻找一个安全的规则来应用字符串转义而不是双倍大小,除非需要。
一个UTF8字节序列"E2-80-A8“(U+2028,行分隔符),在Unicode数据库中是一个完全有效的字符。但是,该序列表示行分隔符(是,不是"0A")。
糟糕的是,许多浏览器(包括Chrome、Firefox和Safari;我没有测试其他浏览器)无法处理包含包含Unicode字符的字符串的JSONP回调。JSONP包含在一个我无法控制的非Unicode HTML中。
浏览器只是在这样的JavaScript上报告无效的代码/语法错误,这在调试工具和所有文本编辑器中看起来都是有效的。我猜测它可能会尝试将"E2-80-A8“转换为BIG-5并打破JS语法。
上面的例子只是Unicode如何让你的系统意外崩溃的一个例子。据我所知,一些黑客可以使用RTL和其他控制字符为他们的利益。Unicode规范中有许多“引号”、“空格”、“符号”和“控件”。
问题:
是否有一个Unicode字符列表供每个程序员了解隐藏的功能(和错误),我们可能不希望它们在我们的应用程序中有效。(例如,Windows在文件名中禁用RTL )。
编辑:
我不是在要求JSON或JavaScript。我正在询问所有程序中Unicode处理的一般最佳实践。
发布于 2012-05-21 02:00:46
有一个字符属性数据库和一个描述它的报告,UNICODE CHARACTER DATABASE,它给出了浏览器“应该”如何处理代码点的好主意。我喜欢这个词,“应该”。Safest将是一个白名单,您可以使用L|M|N|S、字母或标记、数字或符号。
看一下库的ICU project
发布于 2012-05-12 03:18:13
它破坏了javascript,因为字符串中不能有换行符:
var myString = "
";
//SyntaxError: Unexpected token ILLEGAL现在,UTF-8序列"E2-80-A8"解码为unicode代码点U+2028,其处理方式类似于javascript中的换行符:
var myString = "
";
//Syntax Error但是,编写它是安全的。
var myString = "\u2028";
//you can now log myString in console and get real representation of this character这就是正确编码的JSON所具有的。我会考虑对JSON进行适当的编码,而不是保留一份不安全字符的黑名单。(分别是U+2028和U+2029 AFAIK)。
在PHP中:
echo json_encode( chr(0xe2). chr(0x80).chr(0xA8 ) );
//"\u2028"发布于 2012-05-20 00:46:00
看看Unicode图表。有一个非打印字符的列表。这些都是潜在的麻烦制造者。你的朋友U+2028有一群朋友:http://www.unicode.org/charts/PDF/U2000.pdf,而且它不仅仅在2000的范围内。
你可以将它们全部核化,或者将它们分成不同的类别(像U+2028这样的SEP字符变成\n或者正确地转义),等等。
HTH
https://stackoverflow.com/questions/10556875
复制相似问题