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

时间:2014-08-01 07:57:51

标签: json node.js unicode utf-8 ejs

我有一个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中的变量传递给数据了。 JSON比这里更大,我只写了创建一个bug的部分:这里包含的字符串是一个&#34;无效字符&#34; JS错误。我该怎么办 ?我应该使用哪种编码/解码/转义?

我到处都有utf-8,因为我的所有其他字符串都有效,即使是德语或阿拉伯语字符。在这种特殊情况下,这是下面的&#34; mystring&#34; 打破了应用:

enter image description here

如果我删除红色圆圈中的字符就可以了。

这是我收到的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"

因为它是用户输入的文本,所以我必须处理这种字符。我无法访问代码的PHP部分,只能访问nodeJS和客户端JS。如何在JS中找到并删除/转换这些字符?

2 个答案:

答案 0 :(得分:4)

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

我最后用换行符替换了无效的unicode字符(对JSON有效但在JS代码中无效)。这解决了问题

答案 1 :(得分:3)

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

因此:

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

不安全。您可以通过手动将其替换为字符串文字转义版本来实现:

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

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

你的答案中的其他字符实际上对于JS字符串文字是可以的,除了JSON也逃脱的控制字符。

无论如何,删除其中一些字符作为输入过滤步骤可能是有意义的。在您的数据中使用像U + 2028这样的残骸是不寻常的,几乎总是不可取的。您可以考虑过滤掉包含U + 2028/9的characters unsuitable for use in markup以及其他可能会导致页面呈现混乱的重要事项。