Javascript 处理Node.Js/Express应用程序中的西里尔字母编码
在我的应用程序中,用户通过表单的文本区域提交文本,该文本被传递到应用程序,然后由库进行处理,该库将转义javascript字符串 问题是当我用俄语输入文本时,例如Javascript 处理Node.Js/Express应用程序中的西里尔字母编码,javascript,node.js,unicode,encoding,cyrillic,Javascript,Node.js,Unicode,Encoding,Cyrillic,在我的应用程序中,用户通过表单的文本区域提交文本,该文本被传递到应用程序,然后由库进行处理,该库将转义javascript字符串 问题是当我用俄语输入文本时,例如 нам #интересны наши #идеи 我得到的是 '\u043D\u0430\u043C #\u0438\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u044B \u043D\u0430\u0448\u0438 #\u0438\u0434\u0435\u0438' 然后我
нам #интересны наши #идеи
我得到的是
'\u043D\u0430\u043C #\u0438\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u044B \u043D\u0430\u0448\u0438 #\u0438\u0434\u0435\u0438'
然后我需要通过传递这些数据来提取hashtags,而FlockDock根本无法识别它
有人能告诉我吗
1) 将其转换为该表示的必要性是什么
2) 如果将它转换回FlowDock和数据库的西里尔文编码是有意义的,或者我应该用Unicode保存它并尝试使FlowDock使用它吗
谢谢
更新
完整的脚本是:
result = getField(req, field);
result = S(result).trim().collapseWhitespace().s;
// at this point result = "нам #интересны наши #идеи"
result = jsesc(result, {
'quotes': 'double'
});
// now i end up with Unicode as above above (\u....)
var hashtags = FlowdockText.extractHashtags(result);
FlowDock收到结果
,该结果为
\u043D\u0430\u043C #\u0438\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u044B \u043D\u0430\u0448\u0438 #\u0438\u0434\u0435\u0438
而且不会从中提取标签
将其转换为该表示有什么必要
是一个JavaScript库,用于生成尽可能短的仅限ASCII的有效输出
这可用于避免和其他编码问题,甚至在将JSON格式的数据(可能包含U+2028行分隔符、U+2029段分隔符或)分别传递到JavaScript解析器或UTF-8编码器时也可用于避免
在本例中,听起来您根本不打算使用jsesc。这是同一字符串的两种表示形式:
'нам #интересны наши #идеи' === '\u043D\u0430\u043C #\u0438\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u044B \u043D\u0430\u0448\u0438 #\u0438\u0434\u0435\u0438'
看起来flowdock文本
不能很好地处理非ASCII字符
UPD:尝试过,实际上效果很好:
fdt.extractHashtags('\u043D\u0430\u043C #\u0438\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u044B \u043D\u0430\u0448\u0438 #\u0438\u0434\u0435\u0438');
首先不应该使用转义,它提供了字符串文字表示(适合eval
等),而不是字符串
UPD2:我已将您的代码缩减为以下内容:
var jsesc = require('jsesc');
var fdt = require('flowdock-text');
var result = 'нам #интересны наши #идеи';
result = jsesc(result, {
'quotes': 'double'
});
var hashtags = fdt.extractHashtags(result);
console.log(hashtags);
正如我所说,问题在于jsesc
:您不需要它。它返回javascript编码的字符串。在执行eval
时,需要使用串联来防止代码注入,或者类似的操作。例如,如果您添加result=eval(“”+result+“”)代码>,它会起作用。试试这个:
decodeURIComponent("\u043D\u0430\u043C #\u0438\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u044B \u043D\u0430\u0448\u0438 #\u0438\u0434\u0435\u0438");
不,我想用它来逃避“它是”之类的东西。但是当另一个应用程序接收到数据时,它并不“理解”它。谢谢,但是这里有什么区别?您的示例将该字符串以与我尝试使其工作时相同的格式馈送到Flowdock文本,但在我的示例中它不工作。或者我遗漏了什么?区别在于,您拥有的字符串可以这样表示:\\u043D\\u0430\\u043C\#\\u0438\\u043D\\u0442…
,因此它实际上不是您想要的字符串,而是javascript表示。我很确定您根本不需要任何转义,但在我的示例中,我没有\\s我有\s。。。对不起,但我不明白……嗯,真的很难解释。如果您添加了一个完整的脚本(可能是简化的),但它不起作用,我只会告诉您出了什么问题