Javascript 处理Node.Js/Express应用程序中的西里尔字母编码

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' 然后我

在我的应用程序中,用户通过表单的文本区域提交文本,该文本被传递到应用程序,然后由库进行处理,该库将转义javascript字符串

问题是当我用俄语输入文本时,例如

 нам #интересны наши #идеи 
我得到的是

 '\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。。。对不起,但我不明白……嗯,真的很难解释。如果您添加了一个完整的脚本(可能是简化的),但它不起作用,我只会告诉您出了什么问题