Страница 1 из 1

Числовой ключ в INI-файле

Добавлено: Ср авг 16, 2017 13:24
Вахмурка
Все знают, что такое INI-файл (он же файл конфигурации, в просторечии ""инишник"). Также известно, что не существует общепринятого стандарта формата такого файла. Но многие программы, включая ТС, его активно используют. Кроме того, некоторые приложения позволяют пользователю создавать свои инишники и читают из них/пишут в них значения ключей. Поэтому, видимо, авторы подобных приложений стараются соблюдать если не стандарт, то хотя бы сложившиеся традиции.
Поиск в MSDN ничего не дал, или я плохо искал? Официально Microsoft этот формат уже давно не поддерживает (хотя неофициально - поддерживает, см. хотя бы boot.ini). Но, с другой стороны, на меломягких свет клином не сошелся.
Где есть наиболее адекватный список этих правил/норм/ограничений, или каждый создает свой собственный?
Например, как заранее, без экспериментов, понять:
- какую кодировку должен иметь инишник?
- допускается ли использование кириллицы в именах разделов и ключей?
- комментарий должен быть отдельной строкой или может отделяться от любой строки символом ";"?
- может ли к качестве символа комментария использоваться "#"?
- может ли быть пустой ключ? При его чтении возвращается пустая строка или такая запись трактуется как ошибка?
- каково ограничение на длину имени раздела/ключа/значения?
- может ли ключ иметь чисто числовое, без букв, имя?
Меня, признаться, больше всего интересует именно последний вопрос. Если нет, то хочется понять логику: чему противоречит строка

Код: Выделить всё

1=something
Буду признателен за информацию.

Добавлено: Ср авг 16, 2017 13:44
MVV
Также известно, что не существует общепринятого стандарта формата такого файла.
Насколько мне известно, этот формат - творение Microsoft, поэтому истинно правильным синтаксисом я считаю синтаксис INI-файлов, которые читаются и пишутся системными функциями Windows (GetPrivateProfileString, WritePrivateProfileString и др.).
Официально Microsoft этот формат уже давно не поддерживает
Однако функции чтения/записи INI-файлов никуда не делись и продолжают работать.
(хотя неофициально - поддерживает, см. хотя бы boot.ini)
Который после WinXP не используется?
Например, как заранее, без экспериментов, понять:
В виндовозных инишниках поддерживаются только ANSI и UTF-16 (без BOM). Кириллица допускается везде. Комментарии начинаются после точки с запятой и могут быть в конце строк. Ключи без значения скорее всего недопустимы. Самое известное ограничение - на размер файла, 64 КБ. Ключи только из цифр, разумеется, допустимы (в тоталовских инишниках такое сплошь и рядом).

Тоталовские INI- и BAR-файлы читаются и пишется через системные функции, поэтому является примером "нормального" INI-файла. INI-файл моей TCFS2 тоже читается системными функциями и является примером INI-файла с комментариями в конце строк, кроме того, в TCFS2 есть команды для чтения/записи INI-значений через системные функции, например:

Код: Выделить всё

TCFS2 /ef "set_tcini(апап,апапа,`папа`)"

Добавлено: Ср авг 16, 2017 13:51
Вахмурка
Ключи только из цифр, разумеется, допустимы
Alan Campbell, автор плагина ini для PowerPro придерживается, видимо, другой точки зрения, хотя в документации об этом не говорит. У меня чуть мозги не закипели, пока я искал ошибку в своем скрипте, читающим именно такие ключи.
Получается, это следует трактовать как баг или есть какие-то разумные ограничения на числовые ключи?
Впрочем, спрашиваю больше из любопытства. Кэмпбелл уже давно отошел от дел и последняя версия плагина датируется 2004 годом, так что придется выкручиваться...

Добавлено: Ср авг 16, 2017 14:02
MVV
Числовые ключи используются очень часто, когда в секции нужны только значения (для формирования списка), и отсутствие их поддержки - определённо баг.

Ещё важным правилом виндовозных INI-файлов является обрамление кавычками: если значение начинается или заканчивается пробелом, оно берётся в кавычки, при этом перед открывающей кавычкой (самой первой) могут быть пробелы, после закрывающей (самой последней) - пробелы и комментарий, и между этими кавычками могут быть другие кавычки.