0

如何在 UTF-16 中对字符串的非 ascii(ascii > 127)字符(ö、ä、ü 等)进行编码,使“é”变为“\u00e9”,“Ř”变为“\u0158” . 我所做的是将字符转换为十六进制并将前两个字符替换为 \u00 (用于 UTF-16)。但这不起作用……给我垃圾值。请帮助我正确的算法。

这是我写的,但它没有正确转换:

f = open ("input.txt","r")
data = f.read()
x=list(data) 
i=0

for element in x:
    if ord(element)>127:
        y=hex(ord(x[i]))
        y=y[2:]
        y='\u00'+y
        x[i]=y
    i=i+1

data=''.join(x)
t= open("output.txt","w")
t.write(data)

f.close()
t.close()
4

4 回答 4

0

以二进制模式打开文件

with open(filename,"rb") as f:
     print f.read()

如果这不起作用,请尝试内置的编解码器

import codecs

with codecs.open(filename,"rb",encoding="utf8") as f:
     print f.read()
于 2013-03-07T16:36:22.297 回答
0

encode使用字符串的内置方法:

# A string with a single, non-ascii character.
s = '\u00e9'

# UTF-16 encoding beginning with a byte-order-mark to identify its endianness.
s.encode('utf-16')      # b'\xff\xfe\xe9\x00'

# UTF-16 big-endian, no byte-order-mark.
s.encode('utf-16-be')   # b'\x00\xe9'

# UTF-16 little-endian, no byte-order-mark.
s.encode('utf-16-le')   # b'\xe9\x00'
于 2013-03-07T16:46:00.900 回答
0

@TokenMacGuy已将此答案发布到您已删除的旧问题。由于具有足够声誉的用户仍然可以看到已删除的问题,因此我将其复制粘贴在这里:


因此,您正在尝试将非 ascii 代码点“转义”的 unicode 转换为 ascii 表示?如果是这样,如何:

>>> sample = u'some stuff: éŘ'
>>> ''.join(c if 0 < ord(c) <= 127 else '\\u{:04x}'.format(ord(c)) for c in sample)
u'some stuff: \\u00e9\\u0158'
>>> print ''.join(c if 0 < ord(c) <= 127 else '\\u{:04x}'.format(ord(c)) for c in sample)
some stuff: \u00e9\u0158

顺便说一句,这个算法不是utf-16;请不要这样称呼它;它是ASCII!UTF-16 看起来像这样:

>>> sample.encode('utf-16')
'\xff\xfes\x00o\x00m\x00e\x00 \x00s\x00t\x00u\x00f\x00f\x00:\x00 \x00\xe9\x00X\x01'

注意:你没有指定,所以这个例子是在 python2.7 中,而不是 python3;如果您需要,请将其添加到您的问题中


我不确定这是否会帮助你。或者@TokenMacGuy本人可能会编辑此答案以使其更有帮助。

于 2013-03-07T16:53:33.683 回答
0

从问题中不清楚您是想要将字符作为文字字符串'\u00xx'还是想要一个包含正确字符的 Unicode 字符串。

要将字符直接转换为 Unicode,您必须确定它们最初是在哪个代码页中创建的,并将其与decode. 我在这里猜测代码页 852,因为它是我能找到的第一个包含Ř.

>>> data = '\x82\xfc'
>>> x = data.decode('cp852')
>>> x
u'\xe9\u0158'
>>> print x
éŘ

如果您想快速将其转换为仅包含 ASCII 且非 ASCII 字符替换为转义序列的字符串,请使用unicode-escape编码。

>>> y = x.encode('unicode-escape')
>>> y
'\\xe9\\u0158'
>>> print y
\xe9\u0158

Windows 1250 代码页也包含但具有不同的Ř值。同样的技术也适用于那里。

>>> data2 = '\xe9\xd8'
>>> data2.decode('windows-1250')
u'\xe9\u0158'
于 2013-03-07T18:55:23.770 回答