【问题标题】:Node.js, russian characters in the query are poorly decodedNode.js,查询中的俄语字符解码不佳
【发布时间】:2019-05-25 09:16:59
【问题描述】:

我正在使用

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

在nodejs服务器req.url

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

语言环境字符编码UTF-8。正常解码字符需要什么?

【问题讨论】:

  • 您的操作系统和外壳是什么,您正在使用哪个curl?你看到?q=водиÑелÑ的代码是什么?
  • @Amadan 我使用 OS macOS Mojave 版本 10.14.2,shell Zsh 版本 5.5.1。代码服务器:Express版本“^4.16.2”router.get('/', (req) => { console.log(req.originalUrl); });
  • 您能否也报告一下locale 命令给您的信息?
  • @Amadan LANG=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 LC_NUMERIC=en_US.UTF-8 LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=en_US.UTF-8 LC_NAME=en_US.UTF-8 LC_ADDRESS=en_US.UTF-8 LC_TELEPHONE=en_US.UTF-8 LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=en_US.UTF-8 LC_ALL=
  • @Amadan 对不起,我在说谎,不小心在容器里看了。这是这样的LANG= LC_COLLATE="C" LC_CTYPE="UTF-8" LC_MESSAGES="C" LC_MONETARY="C" LC_NUMERIC="C" LC_TIME="C" LC_ALL=

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


【解决方案1】:

问题在于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

【讨论】:

  • 谢谢回答。我知道 decodeURI/encodeURI 的标准。但是,如果我在 php 中使用它,它可以正常工作并且没有 encodeURI。我想知道为什么它在 nodejs 中不起作用
猜你喜欢
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多