Python 3.5 不处理来自 CLI 参数的 unicode 输入
Python 3.5 not handling unicode input from CLI argument
我有一个简单的脚本,我试图使用它来自动执行我为工作所做的一些日语翻译运行。
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 x64 下的 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转储一串字节
$ 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 字符串时发生。
同样简单地删除 print 语句也修复了错误。
我有一个简单的脚本,我试图使用它来自动执行我为工作所做的一些日语翻译运行。
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 x64 下的 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转储一串字节
$ 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 字符串时发生。
同样简单地删除 print 语句也修复了错误。