Python 编码/解码unicode和套接字
我编写了以下两个函数,用于将Python 编码/解码unicode和套接字,python,sockets,unicode,recv,Python,Sockets,Unicode,Recv,我编写了以下两个函数,用于将str转换为bytes和str转换为bytes: def string_to_bytes(self,string,encoding): value = (string.encode(encoding)) if encoding == "utf-8": multiple = 2 else: multiple = 1 fmt = str(multiple * len(value)) + 's'
str
转换为bytes
和str
转换为bytes
:
def string_to_bytes(self,string,encoding):
value = (string.encode(encoding))
if encoding == "utf-8":
multiple = 2
else:
multiple = 1
fmt = str(multiple * len(value)) + 's'
return struct.Struct(fmt).pack(value)
def bytes_to_string(self,byte_string,encoding):
return byte_string.decode(encoding)
现在,当我通过soket发送和接收数据时,我得到以下错误:
11101330000040
starting connection 1 to ('127.0.0.1', 1234)
sending b'11101330000040r\xd8\xb5\xd9\x84#w\xd8\xaf\xd9\x86\xdb\x8c\xd8\xa7@001,001,0-1,0-1@ghomshei#itani\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' to connection 1
m01,2,130,12_18,وَمَن يَرْغَبُ عَن مِّلَّةِ إِبْرَٰهِۦمَ إِلَّا مَن سَفِهَ نَفْسَهُۥ وَلَقَدِ ٱصْطَفَيْنَٰهُ فِى ٱلدُّنْيَا وَإِنَّهُۥ فِى ٱلْءَاخِرَةِ لَمِنَ ٱلصَّٰلِحِينَ#m02,2,238,3_4,حَٰفِظُوا۟ عَلَى ٱلصَّلَوَٰتِ وَٱلصَّلَوٰةِ ٱلْوُسْطَىٰ وَقُومُوا۟ لِلَّهِ قَٰنِتِينَ#m03,2,277,5_7,إِنَّ ٱلَّذِينَ ءَامَنُوا۟ وَعَمِلُوا۟ ٱلصَّٰلِحَٰتِ وَأَقَامُوا۟ ٱلصَّلَوٰةَ وَءَاتَوُا۟ ٱلزَّكَوٰةَ لَهُمْ أَجْرُهُمْ عِندَ رَبِّهِمْ وَلَا خَوْفٌ عَلَيْهِمْ وَلَا هُمْ يَحْزَنُونَ#m04,3,39,5_20,فَنَادَتْهُ ٱلْمَلَٰٓئِكَةُ وَهُوَ قَآئِمٌ يُصَلِّى فِى ٱلْمِحْرَابِ أَنَّ ٱللَّهَ يُبَشِّرُكَ بِيَحْيَىٰ مُصَدِّقًۢا بِكَلِمَةٍ مِّنَ ٱللَّهِ وَسَيِّدًا وَحَصُورًا وَنَبِيًّا مِّنَ ٱلصَّٰلِحِينَ#m05,4,77,39_10,أَلَمْ تَرَ إِلَى ٱلَّذِينَ قِيلَ لَهُمْ كُفُّوٓا۟ أَيْدِيَكُمْ وَأَقِيمُوا۟ ٱلصَّلَوٰةَ وَءَاتُوا۟ ٱلزَّكَوٰةَ فَلَمَّا كُتِبَ عَلَيْهِمُ ٱلْقِتَالُ إِذَا فَرِيقٌ مِّنْهُمْ يَخْشَوْنَ ٱلنَّاسَ كَخَشْيَةِ ٱللَّهِ أَوْ أَشَدَّ خَشْيَةً وَقَالُوا۟ رَبَّنَا لِمَ كَتَبْتَ عَلَيْنَا ٱلْقِتَالَ لَوْلَآ أَخَّرْتَنَآ إِلَىٰٓ أَجَلٍ قَرِيبٍ قُلْ مَتَٰعُ ٱلدُّنْيَا قَلِيلٌ وَٱلْءَاخِرَةُ خَيْرٌ لِّمَنِ ٱتَّقَىٰ وَلَا تُظْلَم
Traceback (most recent call last):
File "./multiconn-client.py", line 100, in <module>
service_connection(key, mask)
File "./multiconn-client.py", line 71, in service_connection
print(payloadanalyzor_instance.bytes_to_string(recv_data,'utf-8'))
File "/home/mohsen/codes/haq/payloadanalyzor.py", line 110, in bytes_to_string
return byte_string.decode(encoding)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd9 in position 2047: unexpected end of data
It raise on client, When I call `bytes_to_string` function.
1110133000040
开始连接1至('127.0.0.1',1234)
正在发送b'1110133000040r\xd8\xb5\xd9\x84\w\xd8\xaf\xd9\x86\xdb\x8c\xd8\xa7@001,001,0-1,0-1@ghomshei#itani\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00连接1
1、21、20、20、10、10、10、10、10、10、10、10、10、10、10、10、10、10、10、10、10、10、18、18、18、18、18、18、18、18、18、18、18、18、18、18、18、18、18、18、18、18、18、18、18、18、自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自2016 2016年1月月月月的的自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自从15155555上的上半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半半U 4,在本月15 15日日晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚晚自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自4ىٰوُوموم۟لهههننننننننننهههههههننن7,5ن7,إِنَّ ٱلَّذِينَ ءَامَنُوا۟ وَعَمِلُوا۟ ٱلصَّٰلِحَٰتِ وَأَقَامُوا۟ ٱلصَّلَوٰةَ وَءَاتَوُا۟ ٱلزَّكَوٰةَ لَهُمْ أَجْرُهُمْ عِندَ رَبِّهِمْ وَلَا خَوْفٌ عَلَيْهِمْ وَلَا هُمْ َََِْننََ#m04,3,39,5,20,فَنَادَتْهُ ٱلْمَلَٰٓئِكَةُ وَهُوَ قَآئِمٌ يُصَلِّى فِى ٱلْمِحْرَابِ أَنَّ ٱللَّهَ يُبَشِّرُكَ بِيَحْيَىٰ مُصَدِّقًۢا بِكَلِمَةٍ مِّنَ ٱللَّهِ وَسَيِّدًا وَحَصُورًا وَنَبِيًّا مِّنَ ٱلََِِِِِ#m05,4,77,3910,أَلَمْ تَرَ إِلَى ٱلَّذِينَ قِيلَ لَهُمْ كُفُّوٓا۟ أَيْدِيَكُمْ وَأَقِيمُوا۟ ٱلصَّلَوٰةَ وَءَاتُوا۟ ٱلزَّكَوٰةَ فَلَمَّا كُتِبَ عَلَيْهِمُ ٱلْقِتَالُ إِذَا فَرِيقٌ مِّنْهُمْ يَخْشَوْنَ ٱلنَّاسَ كَخَشْيَةِ ٱللَّهِ أَوْ أَشَدَّ خَشْيَةً وَقَالُوا۟ رَبَّنَا لِمَ كَتَبْتَ عَلَيْنَا ٱلْقِتَالَ لَوْلَآ أَخَّرْتَنَآ إِلَىٰٓ أَجَلٍ قَرِيبٍ قُلْ مَتَٰعُ ٱلدُّنْيَا قَلِيلٌ وَٱلْءَاخِرَةُ خَيْرٌ لِّمَنِ ٱتَّقَىٰ وَلَا تُظْلَم
回溯(最近一次呼叫最后一次):
文件“/multicann client.py”,第100行,在
服务连接(钥匙、面罩)
文件“/multicann client.py”,第71行,服务连接中
打印(payloadanalyzor_实例。字节到字符串(recv_数据,'utf-8'))
文件“/home/mohsen/codes/haq/payloadanalyzor.py”,第110行,字节到字符串
返回字节\字符串。解码(编码)
UnicodeDecodeError:“utf-8”编解码器无法解码位置2047中的字节0xd9:数据意外结束
当我调用`bytes\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\。
我怎样才能解决这个问题
编辑:
我进入客户端。字符串到字节和字节到字符串必须是相反的,这意味着
s==字符串到字节(字节到字符串))
和s==字节到字符串(字符串到字节))
。为什么不使用“常规”编码/解码?另外。你能解释一下multiple
/Struct.pack
逻辑背后的想法吗?@AKX,unicode的大小不同。@CristiFati,因为我需要用python为recv()
或send()
@PersianGulf UTF-8发送字节,如果UTF-8是一种可变长度编码–multiple=2
根本不能剪切它。此外,您正在加倍编码字节的长度,而不是原始字符串的长度。