Python 3.5无法处理来自CLI参数的Unicode输入

问题描述:

我有一个简单的脚本,我试图使用自动化一些日文翻译,我为我的工作。Python 3.5无法处理来自CLI参数的Unicode输入

import requests 
import sys 
import json 
base_url = 'https://www.googleapis.com/language/translate/v2?key=CANT_SHARE_THAT&source=ja&target=en&q=' 
print(sys.argv[1]) 
base_url += sys.argv[1] 
request = requests.get(base_url) 
if request.status_code != 200: 
     print("Error on request") 
print(json.loads(request.text)['data']['translations'][0]['translatedText']) 

当第一个参数是像字符串初期设定クリア这个脚本会在行

print(sys.argv[1]) 

爆炸随着消息:

line 5, in encode 
return codecs.charmap_encode(input,self.errors,encoding_table)[0] 
UnicodeEncodeError: 'charmap' codec can't encode characters in 
position 0-6: character maps to <undefined> 

所以可得减少

的bug
import sys 
print(sys.argv[1]) 

这似乎是一个编码问题。我使用的是Python 3.5.1,终端是Windows7 x64下的MINGW64。

当我在写Rust1.8相同的节目(和可执行文件相同的条件下运行,即:下的Windows7 64 MINGW64)

use std::env; 
    fn main() { 
     let args: Vec<String> = env::args().skip(1).collect(); 
     print!("First arg: {}", &args[0]); 
    } 

它产生适当的输出:

$ rustc unicode_example.rs 
    $ ./unicode_example.exe 初期設定クリア 
    First arg: 初期設定クリア 

所以我想了解这里发生了什么。 MINGW64 claims有正确的UTF-8支持,它也出现了。 Python3.5.1是否没有完整的UTF-8支持?我认为转向Python3.X是因为Unicode支持。

+0

相关:[Python,Unicode和Windows控制台](http://*.com/q/5419/4279) – jfs

+1

忽略Mingw64 - 问题只是Windows终端本身不支持完整的Unicode - 请参阅http://*.com/questions/36236066/how-to-read-text-copied-from-web-to-txt-file-using-python/36241365#36241365 –

改变

print(sys.argv[1]) 

print(sys.argv[1].encode("utf-8")) 

会造成蟒蛇转储的字节串

$ python google_translate.py 初期設定クリア 
b'\xe5\x88\x9d\xe6\x9c\x9f\xe8\xa8\xad\xe5\xae\x9a\xe3\x82\xaf\xe3\x83 
\xaa\xe3\x82\xa2' 

但是它的工作原理。所以错误,如果这是一个错误...当python解码内部字符串打印到终端,而不是当参数被编码成一个python字符串时发生。

此外,简单地删除打印语句也修复了错误。

+0

您使用了一个错误的术语:'python' **在打印时使用控制台代码页将** Unicode字符串编码为字节(解码方向相反:字节 - > Unicode)。如果您想在Windows控制台中显示无法使用控制台代码页显示的Unicode字符,请阅读我对[上面链接的问题(在发布答案之前)](http:// *。 com/questions/36917921/python-3-5-handling-unicode -input-from-cli-argument#comment61399374_36917921) – jfs

+0

我没有显示到Windows控制台。我正在向Mingw64控制台显示。或者Python的窗口构建不关心区别? – Valarauca

+1

我对“Mingw64控制台”一无所知。你有没有尝试按照[我的答案](http://*.com/a/32176732/4279)中的说明进行操作?结果是什么? – jfs