Автор Тема: [Баг] IniRead() не воспринимает .INI в кодировке UTF-8 c сигнатурой  (Прочитано 4152 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Alecsis1

  • Гость
Недавно в результате «пляски с бубном» обнаружил, что IniRead() спотыкается на .INI, сохранённых в кодировке UTF-8 c сигнатурой (т.н. «with BOM»).
Вместе с тем, UTF-8 без BOM и оба варианта UTF-16 (как с сигнатурой, так и без неё) обрабатываются нормально.
Код:
(нажмите для показа/скрытия)
Протокол «лабораторной работы»:
(нажмите для показа/скрытия)
P.S. №1 Кстати, IniReadSection() и IniReadSectionNames() ведут себя аналогично; остальные Ini…() проверять не стал, предполагая тот же эффект.
P.S. №2 Примеры .INI в разных кодировках см. во вложении.

Русское сообщество AutoIt


Помечен как лучший ответ пользователем Отправлен Декабрь 11, 2017, 16:32:19

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2712
  • Репутация: 1137
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
Alecsis1
1. ini_UTF-8.ini у вас содержит английский текст, это значит, что он не отличается от текста в кодировке ASCI, и соответственно при чтении воспринимается как ASCI и без проблем читается.
2. ini_UTF-16b.ini - Для этой кодировки есть 2 варианта "старшими байтами вперёд" и "младшими байтами вперёд", а разница заключается что символ запишется либо 005F либо 5F00. При чём это указано и в описании функции FileOpen и при выборе в меню Notepad++, поэтому я и не слышал про существование варианта "с BOM" для UTF16.
3. Если в качестве ключей или имён секций использовать русские буквы, чтобы реально задействовать кодировку, то только один из 4-х вернёт верно значение, о чём и сказано в справке.

Alecsis1

  • Гость
AZJIO
1. Насчёт ACSII спора нет, а вот с кодами символов >= 0x80  совсем другой расклад:
(нажмите для показа/скрытия)
И вот что имеем:
(нажмите для показа/скрытия)
Как видим, с UTF-16 и ANSI-1251 всё кошерно, а вот с UTF-8 тотальный пролёт мимо кассы что с сигнатурой, что без неё.

2. По поводу сигнатуры (BOM = Byte Order Mark) UTF-16: она таки да существует, и первые 2 байта файла в этой кодировке всегда = 0xFEFF, что и есть тот самый та самая «BOM». В случае UTF-8  BOM = 0xEFBBBF.
См. также скриншоты для каждого варианта во вложении.

3. Вдогонку в качестве «бонуса» покорёжим регистр символов:
(нажмите для показа/скрытия)
Протокол следственного эксперимента:
(нажмите для показа/скрытия)
Резюме:
  • в кодировке ANSI-1251 имена секций/ключей регистрозависимы, в UTF-16 — нет;
  • нестыковка IniRead() с кодировкой UTF-8 всё же существует, причём в официальном хелпе v3.3.8.1 на эту тему ни слова

Вот, собсс-но, и всё… первоначальный вопрос остаётся открытым, а FileOpen(), имхо, здесь как-то не по теме.

P.S. Маловероятно, что кому-либо в здравом уме и трезвом состоянии придёт в голову так извратиться с именами секций/ключей, да ещё в UTF-8 , однако «осадочек остался» ©  ;)
 :beer:

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2712
  • Репутация: 1137
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
Alecsis1
Я предложил добавить информацию о кодировке в ini-файле и в версию 3.3.9... была добавлена строка:
Цитировать
IniWrite
If you want to use an ini file with Unicode encoding, first create an .ini file by using the FileOpen() function with the mode parameter set to a Unicode parameter.
. То есть 3.3.8.1 работает также, но много началось изменяться начиная с версии 3.3.9..., потому что я настойчиво отписывал все недостатки.

По умолчанию IniWrite создаёт ANSI и если ничего не предпринять, то будут проблемы с поддержкой юникода. Проблема возникает при использовании например языкового файла для поддержки китайского языка в программе.

Можно использовать универсальный вариант IniVirtual. С помощью FileGetEncoding получить кодировку, открыть файл с помощью FileOpen, указав соответствующий тип кодировки и сохранять в той же кодировке. Тогда не придётся перекодировать кракозябры, сразу все проблемы решает, не зависимо от того, в какой кодировке был файл.

Русское сообщество AutoIt

Re: [Баг] IniRead() не воспринимает .INI в кодировке UTF-8 c сигнатурой
« Ответ #3 Отправлен: Август 29, 2013, 15:55:49 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
19 Ответов
7367 Просмотров
Последний ответ Июль 05, 2010, 15:09:30
от Yashied
6 Ответов
5141 Просмотров
Последний ответ Август 01, 2011, 00:46:28
от CreatoR
11 Ответов
7241 Просмотров
Последний ответ Июль 11, 2016, 13:45:15
от MIR
12 Ответов
3989 Просмотров
Последний ответ Сентябрь 18, 2012, 19:47:14
от CreatoR
7 Ответов
1437 Просмотров
Последний ответ Июнь 20, 2015, 20:20:23
от Tapok
25 Ответов
2637 Просмотров
Последний ответ Сентябрь 09, 2015, 00:13:10
от InnI
5 Ответов
1103 Просмотров
Последний ответ Октябрь 28, 2015, 10:24:16
от Medic84
7 Ответов
2375 Просмотров
Последний ответ Январь 17, 2016, 23:25:45
от СН3СН2ОН
7 Ответов
785 Просмотров
Последний ответ Август 26, 2016, 17:31:37
от kolosov
1 Ответов
223 Просмотров
Последний ответ Октябрь 24, 2017, 17:06:29
от sngr