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

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


Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2720
  • Репутация: 1139
    • мой сайт
    • Награды
  • Версия 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-х вернёт верно значение, о чём и сказано в справке.

Помечен как лучший ответ пользователем Отправлен Декабрь 20, 2017, 04:29:55

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
  • *
  • Сообщений: 2720
  • Репутация: 1139
    • мой сайт
    • Награды
  • Версия 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 Ответов
7748 Просмотров
Последний ответ Июль 05, 2010, 15:09:30
от Yashied
12 Ответов
4374 Просмотров
Последний ответ Сентябрь 18, 2012, 19:47:14
от CreatoR
7 Ответов
1705 Просмотров
Последний ответ Июнь 20, 2015, 20:20:23
от Tapok
25 Ответов
3122 Просмотров
Последний ответ Сентябрь 09, 2015, 00:13:10
от InnI
5 Ответов
1371 Просмотров
Последний ответ Октябрь 28, 2015, 10:24:16
от Medic84
7 Ответов
3012 Просмотров
Последний ответ Январь 17, 2016, 23:25:45
от СН3СН2ОН
7 Ответов
1096 Просмотров
Последний ответ Август 26, 2016, 17:31:37
от kolosov
1 Ответов
344 Просмотров
Последний ответ Октябрь 24, 2017, 17:06:29
от sngr
3 Ответов
361 Просмотров
Последний ответ Январь 29, 2018, 14:01:13
от perven1
8 Ответов
338 Просмотров
Последний ответ Июнь 04, 2018, 08:46:48
от AZJIO