2010-01-05 2 views
11

Когда мы вызываем системный вызов в linux, например 'open' или stdio, например 'fopen', мы должны предоставить 'const char * filename'. Мой вопрос в том, что такое кодировка, используемая здесь? Это utf-8 или ascii или iso8859-x? Это зависит от настройки системы или среды?Какая кодировка используется при вызове fopen или open?

Я знаю, что в MS Windows есть _wopen, которые принимают utf-16.

+0

Связанный: http://serverfault.com/questions/87055/change-filesystem-encoding-to-utf-8-in-ubuntu – 2010-01-05 11:39:08

ответ

6

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

6

Это зависит от языкового стандарта системы. Посмотрите на вывод команды «locale». Если переменные заканчиваются в UTF-8, то ваш язык - UTF-8. Большинство современных Linux будут использовать UTF-8. Хотя Эндрю прав, так как технически это просто байтовая строка, если вы не соответствуете языку системы, некоторые программы могут работать некорректно, и невозможно будет получить правильный ввод пользователя и т. Д. Лучше всего придерживаться UTF-8.

+1

Обратите внимание, что возможно иметь файлы, имена которых закодированы в других кодировках, чем по умолчанию, например, если вы распаковываете архив (tarball, ZIP и т. д.), который был упакован кем-то с другим кодированием, чем ваш. – alvherre

+1

Действительно, это очень верно. Разве мы не хотим, чтобы все использовали UTF-8? –

3

Файловые системы, вызывающие Linux, являются кодирующими-агностическими, то есть они не знают о конкретной кодировке (должны знать). Что касается них, байтовая строка, на которую указывает аргумент filename, передается файловой системе as-is. Файловая система ожидает, что имена файлов находятся в правильной кодировке (обычно UTF-8, как упоминается Мэтью Талберт).

Это означает, что вам часто не нужно ничего делать (имена файлов рассматриваются как непрозрачные байтовые строки), но это действительно зависит от того, откуда вы получаете имя файла, и нужно ли вам каким-либо образом манипулировать именем файла ,

0

Я сделал несколько дальнейших запросов по этой теме и пришел к выводу, что существуют два способа использования кодировки имени файла файловыми системами unixoid.

  1. имена файлов закодированы в «Sytem локали», который обычно есть, но нужно, чтобы не быть таким же, как в текущей локали среды, которая отражается командой locale (но некоторые предустановки в глобальном конфигурационном файле).

  2. Имена файлов кодируются в UTF-8, независимо от любых настроек языкового стандарта.

GTK + решает эту кашу, предполагая UTF-8, и позволяет изменить его либо текущей кодировки локали или предоставленного пользователем кодирования.

Qt решает его, предполагая кодировку локали (и эта локаль системы отражается в текущей локали) и позволяет переопределить ее с помощью предоставляемой пользователем функции преобразования.

Итак, нижняя строка: используйте либо UTF-8, либо то, что LC_ALL или LANG сообщают вам по умолчанию, и предоставьте настройку переопределения, по крайней мере, для другой альтернативы.

Смежные вопросы