Node.js,查询中的俄语字符解码不佳

Node.js, russian characters in the query are poorly decoded

我在用

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

在 nodejs 服务器中 req.url

我明白了?q=водиÑелÑ

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

问题在于 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,而是将每个字母作为自己的字符:'LATIN CAPITAL LETTER ETH' (U+00D0) 和 'INVERTED QUESTION MARK' (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