Я работаю в Windows с Python 2.6.1.
У меня есть текстовый файл Unicode UTF-16, содержащий одну строку Hello, если я смотрю на это в двоичном редакторе, я вижу:
FF FE 48 00 65 00 6C 00 6C 00 6F 00 0D 00 0A 00
BOM H e l l o CR LF
Что я хочу сделать, это прочитать в этом файле, запустить его через Google Translate API и записать его и результат в новый текстовый файл Unicode UTF-16.
Я написалследующий скрипт Python (на самом деле я написал что-то более сложное, чем это, с большей проверкой ошибок, но это урезано как минимальный тестовый пример):
#!/usr/bin/python
import urllib
import urllib2
import sys
import codecs
def translate(key, line, lang):
ret = ""
print "translating " + line.strip() + " into " + lang
url = "https://www.googleapis.com/language/translate/v2?key=" + key + "&source=en&target=" + lang + "&q=" + urllib.quote(line.strip())
f = urllib2.urlopen(url)
for l in f.readlines():
if l.find("translatedText") > 0 and l.find('""') == -1:
a,b = l.split(":")
ret = unicode(b.strip('"'), encoding='utf-16', errors='ignore')
break
return ret
rd_file_name = sys.argv[1]
rd_file = codecs.open(rd_file_name, encoding='utf-16', mode="r")
rd_file_new = codecs.open(rd_file_name+".new", encoding='utf-16', mode="w")
key_file = open("api.key","r")
key = key_file.readline().strip()
for line in rd_file.readlines():
new_line = translate(key, line, "ja")
rd_file_new.write(unicode(line) + "\n")
rd_file_new.write(new_line)
rd_file_new.write("\n")
Это дает мне почти Unicode-файл с некоторыми дополнительнымибайтов в нем:
FF FE 48 00 65 00 6C 00 6C 00 6F 00 0D 00 0A 00 0A 00
20 22 E3 81 93 E3 82 93 E3 81 AB E3 81 A1 E3 81 AF 22 0A 00
Я вижу, что 20 - это пробел, 22 - это кавычка, я предполагаю, что «E3» - это escape-символ, который urllib2 использует для указания того, что следующий символ - UTF-16 закодировано ??
Если я запускаю тот же сценарий, но с "cs" (чешский) вместо "ja" (японский) в качестве целевого языка, ответом является все ASCII, и я получаю файл Unicode с моим«Привет» сначала как UTF-16 символов, а затем «Ахой» какоднобайтовые символы ASCII.
Я уверен, что упускаю что-то очевидное, но не вижу, что именно.Я попытался urllib.unquote () в результате запроса, но это не помогло.Я также попытался напечатать строку, как она возвращается в f.readlines (), и все это выглядит довольно правдоподобно, но трудно сказать, потому что мое окно терминала не поддерживает Юникод должным образом.
Любые другие предложения для вещейпытаться?Я посмотрел на предложенные дупсеты, но ни один из них не соответствует моему сценарию.