Для Python 3 (3.8 и предыдущих версий обратно до 3.6) surrogatepass
является обработчиком ошибок по умолчанию.
Это может вызвать проблемы для пользователей с путями к файлам, которые не соответствует этой кодировке.
Почему windows использует surrogatepass
вместо surrogateescape
, как другие платформы (Linux, macOS), которые могут обрабатывать эти байты. Например:
>>> import sys
>>> sys.getfilesystemencoding(), sys.getfilesystemencodeerrors()
('utf-8', 'surrogateescape')
>>>
>>> # This raises an error:
>>>
>>> b'C:\\Users\\me\\OneDrive\\\xe0\xcd\xa1\xca\xd2\xc3\\my.txt'.decode('utf-8', errors="surrogatepass")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe0 in position 24: invalid continuation byte
>>> # Compared to:
>>> b'C:\\Users\\me\\OneDrive\\\xe0\xcd\xa1\xca\xd2\xc3\\my.txt'.decode('utf-8', errors="surrogateescape")
'C:\\Users\\me\\OneDrive\\\udce0͡\udcca\udcd2\udcc3\\my.txt'
Обратите внимание, что, по предположению, я мог бы предположить, что это может быть необходимо, поскольку базовая файловая система NTFS использует UTF-16 вместо байтов с нулевым символом в конце, что требует некоторых ограничений для * 1020. * кодировка файловой системы отсутствует в Linux / macOS.