2016-04-28 2 views
0

Ich habe ein einfaches Skript, das ich versuche zu automatisieren einige der japanischen Übersetzung, die ich für meinen Job tun.Python 3.5 nicht Unicode-Eingabe von 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']) 

Wenn das erste Argument eine Zeichenfolge wie 初期 ist 設定 ク リ ア dieses Skript in Zeile

print(sys.argv[1]) 

Mit der Nachricht explodieren:

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> 

auch So kann der Fehler reduziert werden
import sys 
print(sys.argv[1]) 

Was wie ein Codierungsproblem scheint. Ich benutze Python 3.5.1, und das Terminal ist MINGW64 unter Windows7 x64.

Wenn ich schreibe das gleiche Programm in Rust1.8 (und die ausführbaren Datei unter gleichen Bedingungen läuft, das heißt: MINGW64 unter Windows7 x64)

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

Es produziert die korrekte Ausgabe:

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

Also versuche ich zu verstehen, was hier passiert. MINGW64 claims, um richtige UTF-8-Unterstützung zu haben, die es auch erscheint. Hat Python 3.5.1 nicht die volle Unterstützung von UTF-8? Ich war unter der Annahme, dass der Umzug nach Python3.X wegen Unicode-Unterstützung war.

+0

verwandt: [Python, Unicode und die Windows-Konsole] (http://stackoverflow.com/q/5419/4279) – jfs

+1

Ignorieren Mingw64 - das Problem ist nur, dass das Windows-Terminal nicht vollständig Unicode unterstützt - Siehe http://stackoverflow.com/questions/36236066/how-to-read-text-copied-from-web-to-txt-file-using-python/36241365#36241365 –

Antwort

0

Wechsel

print(sys.argv[1]) 

zu

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

Wird Python verursachen eine Reihe von Bytes

$ 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' 

Dennoch dump es funktioniert. Also der Fehler, wenn das ein Fehler ist ... passiert, wenn Python die interne Zeichenfolge dekodiert, um in das Terminal zu drucken, nicht wenn das Argument in eine Python-Zeichenkette kodiert wird.

Auch das Entfernen der print-Anweisung behebt den Fehler.

+0

Sie verwenden eine falsche Terminologie: 'Python' ** codiert ** Unicode-Zeichenfolgen in Bytes, die während des Druckens eine Codepage der Konsole verwenden (Decodierung ist die umgekehrte Richtung: Bytes -> Unicode). Wenn Sie in der Windows-Konsole Unicode-Zeichen anzeigen möchten, die nicht mit der Codepage Ihrer Konsole dargestellt werden können, lesen Sie meine Antwort zu [die Frage, die ich oben verlinkt habe (bevor Sie Ihre Antwort geschrieben haben]] (http: // stackoverflow. com/questions/36917921/python-3-5-nicht-handling-unicode-input-from-cli-argument # comment61399374_36917921) – jfs

+0

Ich wurde nicht auf der Windows-Konsole angezeigt. Ich habe eine Mingw64-Konsole angezeigt. Oder kümmert sich der Windows-Python nicht um den Unterschied? – Valarauca

+1

Ich weiß nichts über "Mingw64-Konsole". Haben Sie versucht, den Anweisungen in [meine Antwort] (http://stackoverflow.com/a/32176732/4279) zu folgen? Was sind die Ergebnisse? – jfs