Python 3.6+sysфункция
sys.getfilesystemencodeerrors()
кодировки
Возвращает обработчик ошибок для имён файлов: 'surrogateescape' на Linux и macOS, 'surrogatepass' на Windows.
Синтаксис
sys.getfilesystemencodeerrors()
На Linux имя файла — любые байты, не обязательно правильный UTF-8. Такие байты Python прячет в «суррогаты» вида \udcff, и os.listdir() не падает. Но строку с ними нельзя напечатать или записать в UTF-8 — возникнет UnicodeEncodeError «surrogates not allowed». Обратно в исходные байты её переводит os.fsencode() (или encode с тем же обработчиком 'surrogateescape'), а не простой encode('utf-8').
Примеры
import sys
print(sys.getfilesystemencodeerrors()) # → ? surrogateescape — на Windows surrogatepass
import os, sys
if sys.getfilesystemencodeerrors() == 'surrogateescape':
name = os.fsdecode(b'report\xff.txt')
print(ascii(name)) # → 'report\udcff.txt'
try:
name.encode('utf-8')
except UnicodeEncodeError as e:
print(e.reason) # → surrogates not allowed
print(os.fsencode(name)) # → b'report\xff.txt'
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности