好的,我正在运行一个公共JSONPAPI,它的数据由我的PHP服务器提供。我刚刚读到这篇文章:
基本上,如果我的JSON字符串包含U 2028字符(Unicode行分隔符)或U 2029字符(Unicode段落分隔符),那么这是完全有效的JSON。但是,当使用 JSONP 时,JSON 将作为 JavaScript 执行,并且 JavaScript 中的任何字符串都不能包含文字 U 2028 或 U 2029,因为它会破坏 JavaScript。显然,只要您使用正确的JSON解析器,这通常不是问题,但是在JSONP的情况下,浏览器就是JSON解析器。
本质上,如果这些字符在我发送给客户端的JSONP数据的字符串中,就会在字符串中插入一个换行符或段落符,这会中断JavaScript并停止执行。这是可能的,因为API正在发回一些客户端输入的数据。有人可能会在数据库中输入U 2028或U 2029,所以当我以JSONP的形式返回时,它会破坏任何使用我的API的实现。
所以我的问题是,在PHP中,我如何对JSON数据进行清理/输出转义,以便在将其发送到客户端之前删除或转义U 2028和U 2029字符?
目前,我的进程正在对一个数据数组进行json_encode,并将该数据发送到客户端。我应该通过循环遍历数组并对其进行过滤来转义数据,还是一次转义所有JSON编码的字符串?
另一件事是,无论如何,我不确定如何逃脱PHP中的U 2028和U 2029字符。我可以只做一个str_replace吗?我不确定str_replace是否安全多字节,除非我使用一些定制的功能,否则没有mb_str_replace功能。那么如何删除/转义这些unicode字符呢?
非常感谢。
值得指出的是,这不再是必要的。
默认情况下,json_encode()
编码所有非ASCII字符(包括U 2028
JSON_UNESCAPED_UNICODE常量输出非转义UNICODE,可以节省字节。然而,正如斜杠字符被转义一样,因为它在某些上下文中可能很危险,U 2028也是如此
(这些额外的转义可以分别用JSON_UNESCAPED_SLASHES和
JSON_ONESCAPED_LINE_TERMINATORS关闭。)
您可以在PHP端或JavaScript端或两者兼而有之地将U 2028
,U 2029
替换为"
,"
,只要至少发生一次就没关系(它是幂等的)。
您可以只使用普通的字符串替换函数。它们不需要“多字节安全”,并且您可以在任何Unicode编码中轻松地做到这一点(UTF-8、UTF-16、UTF-32都一样好)。上次我检查时,PHP没有Unicode转义序列,这只是PHP是一个笑话的又一个原因,但您可以使用UTF-8的\x
转义…
(简而言之,没有多字节字符串替换函数的原因是因为它是多余的——它将与非多字节字符串替换函数完全相同。)
// Javascript
data = data.replace("\u2028", "\\u2028").replace("\u2029", "\\u2029");
// PHP
$data = str_replace("\xe2\x80\xa8", '\\u2028', $data);
$data = str_replace("\xe2\x80\xa9", '\\u2029', $data);
或者您可以什么都不做,因为PHP默认在json_encode()
中转义非Unicode字符:
// Safe
echo json_encode("\xe2\x80\xa9");
--> "\u2029"
// Correct JSON, but invalid Javascript...
// (Well, technically, JSON root must be array or object)
echo json_encode("\xe2\x80\xa9", JSON_UNESCAPED_UNICODE);
--> "
"
问题内容: 如果我通过$ _GET 传递名称为PHP变量的PHP,则会自动用字符替换它们。例如: …输出以下内容: …我的问题是:有 什么 办法可以阻止我?无法为我的一生弄清我应做的一切 我运行的PHP版本是5.2.4-2ubuntu5.3。 问题答案: 这是PHP.net对其执行原因的解释: 传入变量名称中的点 通常,当将变量传递到脚本中时,PHP不会更改变量的名称。但是,应注意,点(句点,句号
问题内容: 是否有可能做出无法逃脱和?我目前得到: 但我正在寻找这样的事情: 问题答案: 从Go 1.7开始,您仍然 无法使用json.Marshal()做到这一点 。json.Marshal的源代码显示: json.Marshal总是这样做的原因是: 字符串值编码为强制转换为有效UTF-8的JSON字符串,用Unicode替换符文替换无效字节。尖括号“ <”和“>”转义为“ \ u003c”
问题内容: 我想将包含转义字符的字符串转换为普通格式,就像Python的词法分析器所做的一样: 当然,无聊的方法是将所有已知的转义字符一一替换:http : //docs.python.org/reference/lexical_analysis.html#string- literals 您将如何在上述代码中实现? 问题答案: 几个类似的编解码器是可用的,如ROT13和十六进制。 上面是Pyth
问题内容: 我正在尝试获取字符串的前10个字符,并想用替换空格。 我有 但是我不确定下一步该怎么做。 我想要绳子 这是对字符串的测试。 成为 this_is_th 问题答案: 只需使用str_replace: 您可以在上一个和呼叫之后执行此操作,如下所示: 但是,如果您想花哨的话,可以一行完成:
问题内容: 我们如何直接转换为?使用转换到相当容易,但是又很繁琐。在golang中有没有直接的方法可以做到这一点? 问题答案: 您可以使用进行转换。 您应该注意的一件事是,只能取消引用中的字符串(例如,以引号char 或反引号char 开头和结尾```),因此我们必须手动附加该字符串。 例: 输出(在Go Playground上尝试): 注意: 要对HTML文本进行转义和转义,可以使用该包。引用其
问题内容: 我想这些类型的值,转换的,,等多项。在JavaScript中,我们可以使用,但是PHP中有可用的类似方法吗? 问题答案: 通常不需要这样做,因为PHP在大多数情况下都会为您强制类型。对于那些你想显式转换型的情况下,_投_它: