1 回答

TA貢獻1851條經驗 獲得超4個贊
事實是在運行的計算機程序中表示的文本和存儲在文件中的文本,文件名和數據庫是兩個不同的東西。人們可以將前者視為一組字符,而不必關心它們在內部是如何表示的。另一方面,要將文本存儲在文件系統 DB 中,通過網絡傳輸,文本必須以字節表示。這種將程序運行時擁有的“純”文本轉換為字節表示的過程稱為“編碼”。為了更好地理解這一點,我建議閱讀這篇文章。
Python 3,無論是核心語言還是庫,在對文本進行任何 I/O 時都會嘗試自動選擇正確的文本編碼。在您的情況下,它為目標服務器中的文件名選擇了“latin1”編解碼器。
Latin1 僅限于 200 多個有效字符,不能表示大量字符或字形 - 任何非西方語言字符,甚至一些西方語言字符,例如 ?、?、?,都無法用它表示.
建議是在讓 Python 這樣做之前對名稱進行手動編碼,因為這樣我們就可以控制如何處理目標編碼中不存在的字符。由于庫方法.strobinary(
因此,為了保留 latin1 中不存在的有關您的字符的信息,我建議使用轉義編碼 - 其他選項將替換為“?” 或忽略,只是抑制所有字符:
filename = driver.title.encode("latin1", errors="xmlcharrefreplace").decode("latin1") + ".png"
screenshot = driver.save_screenshot(filename)
ftp.storbinary("STOR <PathToServer>" + filename, open(filename, 'rb'))
添加回答
舉報