Я пишу программу на python3, которая получает имена файлов для обработки из аргументов командной строки. Я не понимаю, как правильно обрабатывать разные кодировки.
Я думаю, что я предпочел бы рассматривать имена файлов как байты, а не строки, так как это исключает опасность использования неправильной кодировки. Действительно, некоторые из моих имен файлов используют неправильную кодировку (латинская 1, когда моя системная локаль использует utf-8), но это не мешает работе таких инструментов, как ls. Я бы тоже хотел, чтобы мой инструмент был устойчивым к этому.
У меня две проблемы: аргументы командной строки выдаются мне в виде строк (я использую argparse), и я хочу сообщать пользователю об ошибках в виде строк.
Я успешно адаптировал свой код для использования двоичных файлов, и мой инструмент может обрабатывать файлы, имена которых являются недопустимыми в текущей кодировке по умолчанию, при условии, что они повторяются через файловую систему, потому что я преобразовываю аргументы в двоичные файлы рано, и использовать двоичные файлы при вызове функций fs. Когда я получаю аргумент имени файла, который недопустим, он передается мне как строка в кодировке Юникод со странными символами, такими как \udce8
. Я не знаю, что это такое, и пытаться закодировать его всегда не удастся, будь то с помощью utf8 или с соответствующей (неправильной) кодировкой (здесь латинский номер 1).
Другая проблема связана с сообщениями об ошибках. Я ожидаю, что пользователи моего инструмента проанализируют мой стандартный вывод (следовательно, хотят сохранить имена файлов), но при сообщении об ошибках на stderr я бы лучше закодировал его в utf-8, заменив недопустимые последовательности соответствующими символами «недопустимый / вопросительный знак».
Итак,
1) Есть ли лучший, совершенно другой способ сделать это? (да, исправление имен файлов запланировано, но я все же хотел бы, чтобы мой инструмент был надежным)
2) Как получить аргументы командной строки в их исходном двоичном виде (предварительно не декодированном для меня), зная, что для неправильных последовательностей перекодирование декодированный аргумент завершится неудачно, и
3) Как мне сказать кодеку utf-8 заменять недопустимые, некодируемые последовательности какой-либо недопустимой меткой, а не умирать на мне?