Проблема записи данных Unicode UTF-16 в файл в Python - PullRequest
1 голос
/ 24 марта 2011

Я работаю в 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 (), и все это выглядит довольно правдоподобно, но трудно сказать, потому что мое окно терминала не поддерживает Юникод должным образом.

Любые другие предложения для вещейпытаться?Я посмотрел на предложенные дупсеты, но ни один из них не соответствует моему сценарию.

Ответы [ 2 ]

5 голосов
/ 24 марта 2011

Я считаю, что вывод от Google - UTF-8, а не UTF-16. Попробуйте это исправить:

ret = unicode(b.strip('"'), encoding='utf-8', errors='ignore') 
2 голосов
/ 24 марта 2011

Эти байты E3 не являются "escape-символами".Если кто-то не имел доступа к документации и был вынужден сделать предположение, наиболее вероятным подозрением для кодировки ответа был бы UTF-8.Ожидание (основанное на недельном отпуске в Японии): что-то вроде "Конничива".

>>> response = "\xE3\x81\x93\xE3\x82\x93\xE3\x81\xAB\xE3\x81\xA1\xE3\x81\xAF"
>>> ucode = response.decode('utf8')
>>> print repr(ucode)
u'\u3053\u3093\u306b\u3061\u306f'
>>> import unicodedata
>>> for c in ucode:
...     print unicodedata.name(c)
...
HIRAGANA LETTER KO
HIRAGANA LETTER N
HIRAGANA LETTER NI
HIRAGANA LETTER TI
HIRAGANA LETTER HA
>>>

Выглядит достаточно близко для меня ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...