簡體   English   中英

Python decode() 'utf-8' 編解碼器無法解碼 position 中的字節 0xff 0:無效的起始字節

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM