JSON.stringified()对象中的文本编码问题

我有一个index.html发送文本到PHP代码。 这个PHP通过POST(curl)把它重新发送到一个Node.js服务器,插入一个JSON消息(utf8编码)

//Node.js server file (app.js) -- gets the json and shows it in a <script> to save it in client JS render(index, {json:{string:"mystring"}}) //Template to render (index.ejs) var data = <%=JSON.stringify(json)%>; 

这样我就可以将JSON中的这些variables传递给数据。 JSON比这里更大,我只写了创buildbug的部分:这里包含的string会产生一个“无效字符”JS错误。 我该怎么办 ? 我应该使用哪种编码/解码/转义?

我到处都是utf-8,就像所有其他的string一样,即使是德文或阿拉伯文字也行。 在这种情况下,这是下面的“mystring”打破了应用程序:

在这里输入图像描述

如果我删除了红色圆圈中的字符,它的工作原理。

这是string,因为它是在我收到的JSON:

 "Otto\nTheater-, Konzert- und Gpb\n\u2028\u2028Rhoasse\u00dfe 20\u2028\n51065 K\u00f6ln\n\nTelefon: 0000-000000-0\u2028\nTelefax: 0000-000000\n\nE-Mail: address@mail.com\u2028" 

因为它是一个用户input的文本,我必须处理这种字符。 我没有访问代码的PHP部分,只能到nodeJS和客户端JS。 我怎样才能find并删除/转换这些字符在JS?

 <%- JSON.stringify(data).replace(/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, "\\n") %>; 

我最终用换行符replace了无效的unicode字符(这对JSON有效,但不是在JS代码中)。 这解决了这个问题

JSON通常被认为是JavaScript的一个子集,但并不完全 。 由于不幸的疏忽,在JSONstring文字中允许原始字符U + 2028和U + 2029,但不允许使用JavaScriptstring文字。 在JavaScript中,它们被解释为换行符,所以在string文字中有一个是语法错误。

结果是:

 var data = <%=JSON.stringify(json)%>; 

不安全。 你可以通过手动将它们replace为string文字转义版本来实现:

 JSON.stringify(json).replace('\u2028', '\\u2028').replace('\u2029', '\\u2029') 

通常,最好避免这种问题,并通过将JSON数据放入HTML data-属性来严格分隔代码和数据。 然后可以从客户端脚本中读出DOM,并通过JSON.parse传递。 那么你唯一需要担心的就是正常的HTML转义,希望你的模板语言在默认情况下可以。

你的答案中的其他字符实际上是JSstring文字,除了控制字符,JSON也逃脱了。

作为input过滤步骤,删除这些字符中的某些字符可能是合理的。 在你的数据中,像U + 2028这样的剽窃几乎总是不可取的。 你可以考虑过滤出不适合在标记中使用的字符 ,包括U + 2028/9和其他不好的东西,比如可以搞乱页面渲染的比迪覆盖。