Не ascii имя файла для fopen () - PullRequest
0 голосов
/ 10 ноября 2018

Мне нужно надежное кроссплатформенное решение для чтения конкретного двоичного файла на C. Предположим, я хочу fopen () такой (возможно, большой) файл, выделить временный буфер, а затем fread () последовательность байтов обновить мой SHA1_CTX и, наконец, закрыть мой ФАЙЛ, завершить работу с sha1 и продолжить. Совершенно тривиально, верно?

Но я сомневаюсь в одном: что если имя файла не ASCII? Допустим, у меня будет:

  • /Users/me/Projects/my_file.bin
  • /home/me/файлы/работа/мой_файл.bin
  • С:\\我的檔案\\我的工作.bin
  • D:\\Folder?\\???.bin

Может ли fopen обрабатывать такие пути? Если нет, что я могу сделать? Я могу написать некоторый платформо-зависимый код или поискать кроссплатформенную библиотеку, но очень важно, чтобы мое приложение было как можно меньше, кроме того, оно написано на C, поэтому QT, Boost и т. Д. Не применимы .

Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Практически на каждой платформе, кроме Windows, ожидается, что вы передадите имена файлов стандартным функциям как обычные char[] строки, представленные в кодировке символов используемой локали, и на всех современных системах, которые будут UTF-8. , Вы можете либо:

  • соблюдайте это, гарантируя, что вы вызываете setlocale(LC_ALL,"") (или setlocale(LC_CTYPE,""), если вы не хотите использовать другие функции локали) и рассматриваете весь локальный ввод и вывод текста как в той кодировке (что делает пользователей счастливыми, но возможно, возникают проблемы, когда какой-либо внешний вход (например, из сети) в UTF-8 не может быть представлен, или
  • просто всегда работает в UTF-8, и надеюсь, что передача строк UTF-8 в функции доступа к файловой системе работает благодаря тому, что они являются абстрактными байтовыми массивами.

К сожалению, все это не работает в Windows, но будет работать в ближайшем будущем . Это также работает, если вы создаете свое приложение с Cygwin или midipix . Если не считать этого, вам нужны шайбы, чтобы все работало в Windows, и это огромная боль.

0 голосов
/ 10 ноября 2018

Это зависит от операционной системы и файловой системы.

Возможно, вы не знаете, какая кодировка используется для пути к файлу. Пользователь вашей программы должен знать это.

Однако в 2018 году UTF-8, как правило, используется повсеместно . На практике это не всегда так (особенно в Windows).

Кстати, разные ОС имеют разные ограничения на путь к файлу. В Linux, в принципе, у вас может быть имя файла, содержащее только символ табуляции и возвращаемый символ (конечно, это очень плохой вкус, и никто не делает это на практике; для подробностей прочитайте path_resolution (7) ) , В Windows это запрещено.

Может ли fopen обрабатывать такие пути?

Да. Стандарт C11 (подробнее см. n1570 ) не говорит о кодировке символов.

Другой вопрос, что ваша конкретная реализация делает с такими путями. Зло в деталях, и они могут быть безобразными.

...