Node.js 的编码错误

2023-12-31

我正在用node.js 重写一个小的python 脚本。原来的脚本是这样工作的:

# -*- coding: utf-8 -*-
import urllib
import httplib
import json

def rpc(url, args = { }):
  try:
    post_data = json.dumps({'args': args})
    f = urllib.urlopen(url, post_data)
    if not f or f.code != 200:
      return { 'result': 1, 'error': 'urlopen returned error' }
    data = f.read()
    js_data = json.loads(data)
  except Exception, e:
    return { 'result': 2, 'error': e }
  else:
    return { 'result': 0, 'data': js_data }

print rpc('http://server.local/rpc', {'x': u'тест'})

I use request https://github.com/mikeal/request在 Node.js 中执行相同操作:

var request = require('request')

request.post('http://server.local/rpc', {
    json: {'x': 'тест'}
}, function(err, result) {
    console.log(err, result.body)
})

它可以工作,但是 unicode 数据是乱码,所以我得到ÑеÑÑ代替тест查询回数据时。 这看起来很奇怪,因为 python 和 node.js 都应该发送 utf8 编码的数据。

顺便说一句,我认为服务器是用 perl 编写的,但这就是我所知道的:(

此外,服务器在其他查询上返回 unicode 数据,因此它is能够做到这一点。

更新。我的控制台可以很好地打印 unicode 字符。

更新。重写我的代码以使用node.jshttp module:

var http = require('http')

var options = {
  hostname : 'server.local',
  path     : '/rpc',
  method   : 'POST'
}    
var req = http.request(options, function (res) {
  res.setEncoding('utf8');
  res.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
});    
var body = JSON.stringify({'x': 'тест'})    
req.setHeader('Content-length', body.length)    
// python sends data with this header
req.setHeader('Content-type', 'application/x-www-form-urlencoded')

req.on('error', function (e) {
  console.log('problem with request: ' + e);
});    
req.end(body, 'utf8');

遗憾的是结果是一样的。在两个不同的安装(我的个人 MBA 和生产 Debian 服务器)上也有相同的行为。所以这似乎确实与 Node.js 表示 unicode 数据的方式有关。


这是 python 脚本发出的请求:

POST / HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 43
Host: localhost:1234
User-Agent: Python-urllib/1.17

{"args": {"x": "\u0442\u0435\u0441\u0442"}}

这是 Node.js 服务器发出的请求:

POST /rpc HTTP/1.1
Host: localhost:1234
Content-length: 12
Content-type: application/x-www-form-urlencoded
Connection: keep-alive

{"x":"тест"}

您看到问题了吗? JSON.stringify 将数据编码为 utf8 字符串,但 python 将其编码为 ascii。

如果您的 rpc 服务器不支持 utf8,您可以使用外部库对 json 进行编码。例如,这可以工作:

var request = require('request');
var jju = require('jju');

request.post({
   uri: 'http://localhost:8080/rpc',
   body: jju.stringify({args: {x: "тест"}}, {
       mode: 'json',
       indent: false,
       ascii: true,
   }),
}, function(err, res, body) {
    console.log(body);
});

使用上面的代码,请求将如下所示:

POST /rpc HTTP/1.1
host: localhost:8080
content-length: 41
Connection: keep-alive

{"args":{"x":"\u0442\u0435\u0441\u0442"}}

这与 python 所做的类似。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js 的编码错误 的相关文章

随机推荐

  • Kleisli 组合的编译错误

    我有一个复制自的验证模块面向铁路的编程 http fsharpforfunandprofit com posts recipe part2 在我的应用程序中执行错误处理 type ErrorMessage ErrorMessage of s
  • 强制 Nosetests 使用 Python 2.7 而不是 3.4

    我一直在使用 3 4 版本学习 Python 我最近开始学习 Web py 因此一直使用 Python 2 7 因为 Python 3 4 不支持 web py 我为Python 3 4 和2 7 安装了nose 1 3 4 模块 我需要对
  • SSIS 错误代码:0xC0014009

    如何解决 SQL Server 代理运行作业 SSIS 失败并出现错误代码 0xC0014009 的问题 我的工作 ssis 包将数据从源数据库 interbase 转换到目标 SQL Server 以使用 ODBC 我发现工作失败了 错误
  • ARMAX模型预测在传递exog值时导致“ValueError:矩阵未对齐”

    我正在努力使用 ARMAX 模型预测样本值 拟合模型效果很好 armax mod31 sm tsa ARMA endog sales order 3 1 exog media fit armax mod31 fittedvalues 就我有
  • 带图案边框的自定义 PopOver

    I m trying to implement popover like that 我花了很多时间尝试定制UIPopoverController and UIPopoverBackgroundView 据我了解 使用弹出窗口的公共 API
  • 在函数中使用模板模板参数时出现无匹配函数错误

    我正在尝试使用模板模板参数定义一个函数 我只想知道它是如何工作的 我有以下内容 template
  • MSMQ 获取所有专用队列

    有没有办法使用 NET 4 0 获取 MSMQ 5 0 上的所有队列 干杯 MessageQueue GetPrivateQueuesByMachine http msdn microsoft com en us library syste
  • 删除 Xcode 生成的源代码中的版权

    使用 Xcode 4 创建新的源代码文件时 有什么方法可以完全删除带有版权声明的注释吗 代替 MainView h ProjectName Created by First Last Name on 1 2 34 Copyright c 2
  • Angular 4:何时以及为何在构造函数中使用 @Inject?

    问题陈述 我正在学习 Angular 4 我偶然发现了一段代码 其中 Inject正在使用在constructor我不明白为什么 代码和来源 我正在使用 Angular 4 材质 代码来源 https material angular io
  • 选择特定的 Ubuntu 版本

    如果我使用默认的 travis 文件 那么构建机器似乎是 Ubuntu Precise Hit http ppa launchpad net precise Release gpg 是否有任何调整可以使用值得信赖或乌托邦的机器 现在已经实现
  • 在 Yii2 中覆盖 Bootstrap CSS

    我有一个NavBar我想覆盖 Yii 放在该小部件上的所有类 在搜索谷歌并阅读文档后 我发现这段代码 Yii container gt set yii bootstrap NavBar containerOptions gt class g
  • 如何在 OCR 认知中使用 application/octet-stream 发送图像

    您好 我正在尝试使用 Microsoft 的 OCR API 它期望内容类型应用程序 八位字节流和正文 发布二进制文件 我尝试将图像作为 Base64 二进制 发送 只是二进制 但是它不起作用 有人知道这张图片需要如何发送吗 文档链接 ht
  • 为什么 Path.GetDirectoryName 函数必须依赖于 260 个字符的限制

    public static void Main testing file name var fileName server7 EmailAttachments myfolder abc 2012 1126 e85c6b82 edc5 4ce
  • 使用简单 HTML DOM 循环遍历表格

    我正在使用 Simple HTML DOM 从 HTML 文档中提取数据 但有几个问题需要帮助 在以以下开头的行上if td gt find a 我想分别提取href和锚节点的内容 并将它们放在单独的变量中 然而 该代码不起作用 请参阅下面
  • 如何防止在文本字段中输入特定字符?

    我想知道如何阻止在 UITextfield 中输入某些字符 例如 如果我不希望在此文本字段中键入字母 A G P Q X 但允许其余字母 我对此很陌生 感谢您的帮助 您需要为此使用 UITextViewDelegate 在委托方法之一中捕获
  • 数字格式,写1e-5而不是0.00001

    我用过read table读取包含数字 例如 0 00001 的文件 当我写回它们时write table这些数字显示为 1e 5 如何保留旧格式 我只想改变scipen呼叫前的选项write table 请注意 这也会改变打印到控制台时数
  • Eclipse 中的 ESlint

    我在工作中得到了一个 Web 项目 其中有一个 eslintrc 文件 并被告知使用它 我认为这会强制执行代码样式 听起来是个好主意 但我以前从未这样做过 我刚刚切换到 Eclipse Neon 但我找不到有关如何使用它的教程 我确实发现了
  • HTTP 状态 500 - 过滤器执行引发异常 - doFilter 和 invokeDelegate 重复

    我正在使用 Spring MVC 4 2 5 和 Spring Security 4 1 3 来开发 Web 应用程序 当我尝试将后者合并到我的 mvc 项目中时 我开始遇到问题 目前 经过多次尝试 我在 localhost 8080 Be
  • Google 搜索 API 网站限制

    根据 Google 自定义搜索 API 文档 http code google com apis customsearch docs start html sites http code google com apis customsear
  • Node.js 的编码错误

    我正在用node js 重写一个小的python 脚本 原来的脚本是这样工作的 coding utf 8 import urllib import httplib import json def rpc url args try post