2016-04-28 95 views
0

我有一個簡單的腳本,我試圖使用自動化一些日文翻譯,我爲我的工作。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://stackoverflow.com/q/5419/4279) – jfs

+1

忽略Mingw64 - 問題只是Windows終端本身不支持完整的Unicode - 請參閱http://stackoverflow.com/questions/36236066/how-to-read-text-copied-from-web-to-txt-file-using-python/36241365#36241365 –

回答

0

改變

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:// stackoverflow。 com/questions/36917921/python-3-5-handling-unicode -input-from-cli-argument#comment61399374_36917921) – jfs

+0

我沒有顯示到Windows控制檯。我正在向Mingw64控制檯顯示。或者Python的窗口構建不關心區別? – Valarauca

+1

我對「Mingw64控制檯」一無所知。你有沒有嘗試按照[我的答案](http://stackoverflow.com/a/32176732/4279)中的說明進行操作?結果是什麼? – jfs