繁体   English   中英

在python中将unicode UTF-16数据写入文件时出现问题

[英]Problem writing unicode UTF-16 data to file in python

我正在使用Python 2.6.1在Windows上工作。

我有一个包含单个字符串Hello的Unicode UTF-16文本文件,如果在二进制编辑器中查看它,则会看到:

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”是urllib2用来表示下一个字符是UTF-16编码的转义字符?

如果我运行相同的脚本,但使用“ cs”(捷克语)而不是“ ja”(日语)作为目标语言,则响应为全ASCII,并且我首先以UTF-16字符和“ Hello”获得Unicode文件,并且然后将“ Ahoj”作为单字节ASCII字符。

我确定我缺少明显的东西,但看不到。 我对查询的结果尝试了urllib.unquote(),但没有帮助。 我还尝试打印返回f.readlines()的字符串,这看起来似乎很合理,但是由于我的终端窗口不正确支持Unicode,所以很难说出来。

还有其他建议可以尝试吗? 我看过建议的骗子,但似乎都不太符合我的情况。

我相信Google的输出是UTF-8,而不是UTF-16。 尝试此修复程序:

ret = unicode(b.strip('"'), encoding='utf-8', errors='ignore') 

这些E3字节不是“转义字符”。 如果无法访问文档并被迫猜测,则响应编码最可能的嫌疑人将是UTF-8。 期望值(基于日本的一周假期):类似于“ konnichiwa”。

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

看起来足够接近我...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM