[英]'utf-8' codec can't decode byte 0xff in position 0: invalid start byte / unexpected end of data
[英]Python decode() 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
我正在構建這個套接字應用程序,每次我收到以下錯誤:
UnicodeDecodeError:“utf-8”編解碼器無法解碼 position 中的字節 0xff 0:無效的起始字節
以下是來自服務器的相關行:
filename = client_sock.recv(1024).decode()
filesize = client_sock.recv(1024).decode()
以下是來自客戶的相關行:
self.sock.send(file_dir.encode())
self.sock.send(str(filesize).encode())
錯誤消息發生在服務器的第二行。 (filesize =) 以下是顯示客戶端將發送到服務器的內容的打印。
print(file_dir) # Output is D:/Statispic2/Photos/photo3.jpg
print(filesize) # Output is 96523
這個錯誤有時只會發生,這真的很奇怪。 我查看了其他提出類似問題的問題,但他們的解決方案要么無效,要么不相關。
如果您想查看整個代碼或有任何其他問題,請告訴我! 非常感謝!
發生錯誤是因為該字節無法解碼為 utf-8,您可以將其作為異常處理,並在異常處理時將其解碼為“utf-16”:
filename = client_sock.recv(1024)
filesize = client_sock.recv(1024)
try:
decoded_filename = filename.decode()
decoded_filesize = filename.decode()
except UnicodeDecodeError:
decoded_filename = filename.decode('utf-16')
decoded_filesize = filename.decode('utf-16')
或者,您可以在解碼過程中忽略異常,但不推薦這樣做...
filename = client_sock.recv(1024).decode("utf-8", "ignore")
filesize = client_sock.recv(1024).decode("utf-8", "ignore")
您讀取數據的方法不可靠,因此您可能在第一次recv
中讀取的數據比您想要的更多,並在第二次接收中獲取非字符數據。 TCP 是一種流式協議,僅僅因為您在單獨的send()
調用中發送兩個字符串並不意味着接收者將在單獨的recv()
調用中獲取它們。
如果您要發送不同的數據片段,您必須有某種方法知道一個片段何時結束,下一個片段何時開始。 您的解決方案的規則構成一個協議。
另請參閱我的答案和其他人以准確讀取 K 字節。 如果您的協議以該片段的長度為每個片段添加前綴,這可能會很有用。
我有類似的問題。 我剛剛刪除了.decode()
並且得到了適當的結果,所以在你的情況下:
self.sock.send(file_dir)
self.sock.send(str(filesize))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.