如何编码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()
答案 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)
# 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'