Java调用Python时的编码问题

来源:互联网 发布:office电脑版办公软件 编辑:程序博客网 时间:2024/06/12 20:01

最近的一个项目,用Java做web服务器,里面有HTTP请求的需求,而Java对HTTP客户端的支持少之又少,而且不大好用,故转而求之Python。Python在这方面做的非常好,特别是包揽了对Cookie的管理,程序员不必再在上面费心。但是问题也随之而来,由于我的Python程序导入了许多第三方包,所以使用Java调用Python的时候只能通过命令行调用,这成了乱码的来源。

我们使用如下代码运行Python程序:

Process proc = Runtime.getRuntime().exec("python  D:\\demo.py 参数1 参数2 参数3");  proc.waitFor();

在调用命令行的同时传入了三个参数,而且都是中文字符串。

然后,在Python中接收这三个参数:

# -*- coding: utf8 -*-if __name__ == '__main__':    param1 = sys.argv[1]    param2 = sys.argv[2]    param3 = sys.argv[3]

于是param1、param2、param3就成了乱码。原因很简单,我的Python程序声明了编码类型为UTF-8,而命令行的默认编码是GBK,所以从命令行参数读取到的是GBK编码的字符串,所以如果按照UTF-8来解码肯定是乱码。解决方法是,读取到的三个参数,先解码为Unicode,再编码为UTF-8,代码更改如下:

# -*- coding: utf8 -*-if __name__ == '__main__':    param1 = sys.argv[1].decode('GBK').encode('utf-8')    param2 = sys.argv[2].decode('GBK').encode('utf-8')    param3 = sys.argv[3].decode('GBK').encode('utf-8')

这样就搞定了。

困惑我很久的是Unicode这个东西,我一直以为Unicode就是UTF-8!!!可是昨天我才知道Unicode是一套复杂的字符编码标准,简单来说就是将人类使用的每个所谓字符与一个非负整数对应,并且保证不同的字符对应的整数一定不同。UTF-8是这个整数的编码方式,用1到4字节来表达一个整数。详细分析可参考知乎-《Unicode和UTF-8有何区别》。

0 0
原创粉丝点击