如何将编码数据从python发送到nodejs

时间:2017-07-07 06:12:37

标签: javascript python node.js

我想将 Python3 中的一些字符串数据发送到 nodeJs 。该字符串是韩文字符,我将其编码为 utf8 。(因为我不知道其他方式安全地发送数据。)当我发送(从python)它是ByteStream和nodeJs我收到它作为数组。我将此数组转换为String。但现在我无法将字符串解码回原始韩文字符。 以下是我正在使用的一些代码。

input = sys.argv[1]
d = bot.get_response(input)
data = str(d).encode('utf8')

print(data)

的NodeJS

var utf = require('utf8');
var python = require('python-shell');

var pyt = path.normalize('path/to/my/python.exe'),
        scrp = path.normalize('path/to/my/scriptsFolder/'),


    var options = {
        mode: 'text',
        pythonPath: pyt,
        pythonOptions: ['-u'],
        scriptPath: scrp,
        encoding: 'utf8',
        args: [message]
    };

    python.run('test.py', options, function (err, results) {

        //here I need to decode 'results'
        var originalString = utf.encode(results.toString());// that code is not working for me

    });

我使用了几个像utf8这样的lib来解码但没有帮助。 有人可以告诉我们如何让它发挥作用。

修改

我必须使用更多信息进行编辑。 我尝试过@smarx方法,但没有用。

我有两个案例:

1。如果我从python发送数据作为字符串,这是我在nodeJs b'\xec\x95\x88\xeb\x85\x95\xed\x95\x98\xec\x8b\xad\xeb\x8b\x88\xea\xb9\x8c? \xec\x9d\xb4\xed\x9a\xa8\xec\xa2\x85 \xea\xb3\xa0\xea\xb0\x9d\xeb\x8b\x98! \xeb\x8f\x99\xec\x96\x91\xeb\xa7\xa4\xec\xa7\x81\xec\x9e\x85\xeb\x8b\x88\xeb\x8b\xa4

中得到的

2。如果我对数据进行编码并发送。我得到�ȳ��Ͻʴϱ�? ��ȿ�� ������! �

4 个答案:

答案 0 :(得分:1)

我仍然不确定python.run是做什么的,因为您不会分享该代码,但这是我的代码版本,它工作正常:

<强> test.py

print("안녕 세상")

<强> app.js

const { exec } = require('child_process');

exec('python3 test.py', function (err, stdout, stderr) {
    console.log(stdout);
});

// Output:
// 안녕 세상

答案 1 :(得分:1)

我在项目中遇到了完全相同的问题,现在终于找到了答案。

我通过使用这些代码解决了我的问题。

它可以在Windows上运行(macOS和Linux,它们的默认系统将其编码为'utf8',因此不会发生此问题)。

我希望它也能对您有所帮助!

#in the python file that your javascript file will call by python-shell module put those code
import sys    
sys.stdout.reconfigure(encoding='utf-8')

我从python-shell描述中找到了提示。

feature >Simple and efficient data transfers through stdin and stdout streams

答案 2 :(得分:0)

使用 python-shell 时,我遇到相同的问题。

这是我的解决方法:

.encode('utf-8')之后的字符串是二进制字符串。因此,您需要直接在stdout上打印它。

test.py 中,它会打印utf-8 json,其中包含一些中文字符:

sys.stdout.buffer.write(json.dumps({"你好":"世界"}, ensure_ascii=False).encode('utf8'))
print() # print \n at ending to support python-shell in json mode

main.js

let opt = {mode: 'json', pythonOptions: ['-u'], pythonPath: 'python', encoding: 'utf8'}

let pyshell = new PythonShell('lyric.py', opt);
pyshell.on('message', function (message) {

    console.log(message);  //*** The console msg may still wrong (still ���)
    let json = JSON.stringify(message);
    let fs = require('fs');
    fs.writeFile('myjsonfile.json', json, 'utf8', function () {
    }); //*** The output json file will be correct utf8 output
});

结果: enter image description here 这表明味精在utf-8中正确接收,因为json输出正确。 但是console.log输出显然失败了。 我不知道有什么办法可以修复console.log输出。 (Windows 10)

答案 3 :(得分:0)

在节点js中使用python中的数据(字符串)时,我遇到了同样的麻烦。

我以这种方式解决了这个问题:

如果您的Windows Console代码页不是UTF-8,请

尝试将Windows Console的默认代码页更改为UTF-8 。 (在我的情况下,默认代码页为CP949。)

就我而言:

我收到了类似������2������������的消息。

我尝试了在线(http://code.cside.com/3rdpage/us/url/converter.html)编码

然后我发现我的字符串编码为cp949->解码为utf-8。