【问题标题】:Dealing with the Cyrillic encoding in Node.Js / Express App在 Node.Js / Express App 中处理 Cyrillic 编码
【发布时间】:2014-03-16 18:01:36
【问题描述】:

在我的应用程序中,用户通过表单的 textarea 提交文本,该文本被传递到应用程序,然后由 jsesc 库处理,该库会转义 javascript 字符串。

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

 нам #интересны наши #идеи 

我得到的是

 '\u043D\u0430\u043C #\u0438\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u044B \u043D\u0430\u0448\u0438 #\u0438\u0434\u0435\u0438'

然后我需要通过FlowDock 传递这些数据以提取主题标签,而 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 收到result

\u043D\u0430\u043C #\u0438\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u044B \u043D\u0430\u0448\u0438 #\u0438\u0434\u0435\u0438

并且不会从中提取主题标签...

【问题讨论】:

    标签: javascript node.js unicode encoding cyrillic


    【解决方案1】:

    这是同一字符串的两种表示形式:

    'нам #интересны наши #идеи' ===  '\u043D\u0430\u043C #\u0438\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u044B \u043D\u0430\u0448\u0438 #\u0438\u0434\u0435\u0438'
    

    看起来 flowdock-text 不适用于非 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 + '"');,它将起作用。

    【讨论】:

    • 谢谢,但这里有什么区别?您的示例将该字符串以与我试图使其工作相同的格式提供给 Flowdock-Text,但在我的情况下它不起作用。还是我错过了什么?
    • 不同的是,你拥有的字符串可以这样表示:\\u043D\\u0430\\u043C #\\u0438\\u043D\\u0442...,所以它实际上不是你想要的字符串,而是一个 javascript 表示。我很确定你根本不需要任何转义
    • 但在我的例子中我没有 \\s 我有 \s...对不起,但我不明白...
    • 嗯,这真的很难解释。如果你添加一个完整的脚本(可能会被简化),但它不起作用,我只会告诉你哪里出了问题
    【解决方案2】:

    将其转换为该表示的需要是什么?

    jsescescaping JavaScript strings 的 JavaScript 库,同时生成最短的有效纯 ASCII 输出。 Here’s an online demo.

    这可用于避免 mojibake 和其他编码问题,甚至在传递 JSON 格式的数据(可能包含 U+2028 LINE SEPARATOR、U+2029 PARAGRAPH SEPARATOR 或 lone surrogates)时避免 avoid errors分别到 JavaScript 解析器或 UTF-8 编码器。

    听起来在这种情况下您根本不打算使用 jsesc。

    【讨论】:

    • 不,我想用它来逃避诸如“它的”之类的东西。但是,当另一个应用程序接收数据时,它不会“理解”它。
    【解决方案3】:

    试试这个:

    decodeURIComponent("\u043D\u0430\u043C #\u0438\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u044B \u043D\u0430\u0448\u0438 #\u0438\u0434\u0435\u0438");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 2013-03-20
      • 2021-12-23
      • 1970-01-01
      • 2014-12-15
      相关资源
      最近更新 更多