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>
所以可得减少
的bugimport 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支持。
改变
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字符串时发生。
此外,简单地删除打印语句也修复了错误。
您使用了一个错误的术语:'python' **在打印时使用控制台代码页将** Unicode字符串编码为字节(解码方向相反:字节 - > Unicode)。如果您想在Windows控制台中显示无法使用控制台代码页显示的Unicode字符,请阅读我对[上面链接的问题(在发布答案之前)](http:// *。 com/questions/36917921/python-3-5-handling-unicode -input-from-cli-argument#comment61399374_36917921) – jfs
我没有显示到Windows控制台。我正在向Mingw64控制台显示。或者Python的窗口构建不关心区别? – Valarauca
我对“Mingw64控制台”一无所知。你有没有尝试按照[我的答案](http://*.com/a/32176732/4279)中的说明进行操作?结果是什么? – jfs
相关:[Python,Unicode和Windows控制台](http://*.com/q/5419/4279) – jfs
忽略Mingw64 - 问题只是Windows终端本身不支持完整的Unicode - 请参阅http://*.com/questions/36236066/how-to-read-text-copied-from-web-to-txt-file-using-python/36241365#36241365 –