ftplib
не знает юникода вообще.Он предназначен для передачи байтовых строк для имен файлов, и он будет возвращать байтовые строки при запросе списка каталогов.Это точные строки байтов, переданные / возвращенные с сервера.
Если вы передадите строку Unicode в ftplib
в Python 2.x, он будет приведен к байтам, когдаотправлено в базовый объект сокета.Это принуждение использует кодировку Python по умолчанию, т.е.US-ASCII для безопасности, с исключениями, сгенерированными для не-ASCII символов.
Сообщение Python-dev, с которым вы связались, говорит о ftplib
в Python 3.x, где строки по умолчанию являются Unicode.Это оставляет такие модули, как ftplib
, в сложной ситуации, потому что, хотя они теперь используют строки Unicode на своем внешнем интерфейсе, фактический протокол позади него основан на байтах.Следовательно, необходим дополнительный уровень кодирования / декодирования, и без явного вмешательства для определения того, какая кодировка используется, есть справедливое изменение, которое он выберет неправильно.
ftplib
в 3.x selectedпо умолчанию ISO-8859-1, чтобы сохранить каждый байт как символ внутри строки Unicode.К сожалению, это даст неожиданные результаты в общем случае, когда целевой сервер использует параметры сортировки UTF-8 для имен файлов (независимо от того, знает ли сам демон FTP, что имена файлов являются UTF-8, чего обычно нет).В ряде случаев, подобных этому, стандартные библиотеки Python были жестоко взломаны на строки Unicode с негативными последствиями;Аккумуляторы Python 3, входящие в комплект, по-прежнему протекают едкая жидкость IMO.