将非ascii char编码为UTF-16

时间:2013-03-07 16:31:49

标签: python

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

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

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 个答案:

答案 0 :(得分:0)

以二进制模式打开文件

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

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

import codecs

with codecs.open(filename,"rb",encoding="utf8") as f:
     print f.read()

答案 1 :(得分:0)

使用内置encode method of strings

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

答案 2 :(得分:0)

@TokenMacGuy已将此答案发布到the old question which you've deleted。由于具有足够声誉的用户仍然可以看到已删除的问题,因此我会在此处为您复制粘贴:


所以你试图从unicode转换为ascii表示,其中非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

顺便说一下,这个算法是 NOT 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他自己会编辑这个答案以使其更有帮助。

答案 3 :(得分: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 code page也包含Ř,但值不同。同样的技术也适用于那里。

>>> data2 = '\xe9\xd8'
>>> data2.decode('windows-1250')
u'\xe9\u0158'