我想知道如何将ISO-8859-2(拉丁语-2)字符(我的意思是表示ISO-8859-2编码字符的整数或十六进制值)转换为UTF-8字符。
我需要在python中使用我的项目:
使用Python 3.4.3
txt_str = "ąęłóźć"
txt_str.decode('ISO-8859-2')
Traceback (most recent call last): File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'decode'
主要问题仍然是为“decode”方法准备有效的输入(它在python 2.7.10中工作,那就是我在这个项目中使用的那个)。如何从十进制值准备有效字符串,这是拉丁文2代码?
请注意,由于我正在使用的设备和通信协议限制,从串口接收utf-8字符会很复杂。
根据要求提供样本数据:
68632057
62206A75
7A647261
B364206F
20616775
777A616E
616A2061
6A65696B
617A20B6
697A7970
6A65B361
70697020
77F36469
62202C79
6E647572
75206A65
7963696C
72656D75
6A616E20
73726F67
206A657A
65647572
77207972
73772065
00000069
这是一些示例数据。 ISO-8859-2推入uint32,每个int 4个字符。
管理拆箱的代码:
l = l[7:].replace(",", "").replace(".", "").replace("\n","").replace("\r","") # crop string from uart, only data left
vl = [l[0:2], l[2:4], l[4:6], l[6:8]] # list of bytes
vl = vl[::-1] # reverse them - now in actual order
要从十六进制字符串中获取整数值,我可以使用:
int_vals = [int(hs, 16) for hs in vl]
答案 0 :(得分:2)
您的示例不起作用,因为您尝试使用str来保存字节。在Python 3中,您必须使用byte
字符串。
实际上,如果您正在使用PySerial,那么无论如何您都将读取字节字符串,您可以根据需要进行转换:
with serial.Serial('/dev/ttyS1', 19200, timeout=1) as ser:
s = ser.read(10)
# Py3: s == bytes
# Py2.x: s == str
my_unicode_string = s.decode('iso-8859-2')
如果你的iso-8895-2数据实际上被编码为字节的ASCII十六进制表示,那么你必须应用额外的编码层:
with serial.Serial('/dev/ttyS1', 19200, timeout=1) as ser:
hex_repr = ser.read(10)
# Py3: hex_repr == bytes
# Py2.x: hex_repr == str
# Decodes hex representation to bytes
# Eg. b"A3" = b'\xa3'
hex_decoded = codecs.decode(hex_repr, "hex")
my_unicode_string = hex_decoded.decode('iso-8859-2')
现在您可以将my_unicode_string传递给您喜欢的XML库。
答案 1 :(得分:1)
Interesting sample data. Ideally your sample data should be a direct print of the raw data received from PySerial. If you actually are receiving the raw bytes as 8-digit hexadecimal values, then:
#!python3
from binascii import unhexlify
data = b''.join(unhexlify(x)[::-1] for x in b'''\
68632057
62206A75
7A647261
B364206F
20616775
777A616E
616A2061
6A65696B
617A20B6
697A7970
6A65B361
70697020
77F36469
62202C79
6E647572
75206A65
7963696C
72656D75
6A616E20
73726F67
206A657A
65647572
77207972
73772065
00000069'''.splitlines())
print(data.decode('iso-8859-2'))
Output:
W chuj bardzo długa nazwa jakiejś zapyziałej pipidówy, brudnej ulicyumer najgorszej rudery we wsi
Google Translate of Polish to English:
The dick very long name some zapyziałej Small Town , dirty ulicyumer worst hovel in the village
答案 2 :(得分:-1)
此主题已关闭。工作代码,处理需要完成的任务:
x=177
x.to_bytes(1, byteorder='big').decode("ISO-8859-2")