Node.js,查询中的俄语字符解码错误

时间:2018-12-27 10:23:08

标签: node.js utf-8 decode utf-16

我正在使用

curl -Lk 'https://my-site.ru/?q=повар'

以及在nodejs服务器req.url

我看到了?q=водиÑелÑ

区域设置字符编码UTF-8。正常解码字符需要什么?

1 个答案:

答案 0 :(得分:0)

问题在于curl无法正确发送URL。 URL应该采用URL编码(其中повар应该为%D0%BF%D0%BE%D0%B2%D0%B0%D1%80)是符合标准的。要使curl以这种格式发送,您可以执行此操作(请注意,我必须使用-G强制执行GET协议,否则--data-encode会将其设为POST):

curl -GLk 'https://my-site.ru/' --data-encode 'q=повар'

然后req.query.q将是"повар"

您的curl将其直接发送为UTF-8,这在URL中是非标准的。我得到поваÑ(不是您所说的)。第一个字母п变成D0 BF,Express不会将其解码为UTF-8,而是将每个字母都当作自己的字符:“拉丁文大写字母ETH”(U + 00D0)和“ INVERTED”问号'(U + 00BF)-即п。可以对此进行解码;在Node中,最简单的方法是使用utf8包(utf8.decode(req.query.q));但是我强烈建议您只使用标准。

请注意,当您在浏览器中输入https://my-site.ru/?q=повар(而不是curl)时,您的浏览器实际上将正确地发送https://my-site.ru/?q=%D0%BF%D0%BE%D0%B2%D0%B0%D1%80