Marsianin wrote:Так может блокнот его сохранять в UTF8 не умеет?
Моя очередь "не понимать", причем обоих
1. ini-файл имеет кодировку ANSI1251 (у меня, например, совершенно точно).
Т.о. я "не понимаю" зачем аргументировать хотение/желание переводить ini из ANSI в UTF-8 тем, что блокнот его "портит". Блокнот ничего просто так не портит (если с ним "играют по правилам"). И кодировка ANSI в блокноте "умалчиваемая". Т.е. подозревать блокнот в том, что он САМОВОЛЬНО переигрывает ее (ANSI) в UTF-8 (или наоборот) после сохранения изменений у меня нет оснований. В предложении использовать UTF-8 нет ничего плохого, просто аргументация не верна.
2. Даже "Стандартный блокнот" (от WinXP_Sp2_RUS) версии 5.1 поддерживает 4 кодировки: ANSI, Юникод, Юникод Big Endian, UTF-8 (наверняка и в Vista/Win7 уж никак не меньше).
Т.о. я "не понимаю" при чем здесь умение/неумение блокнота работать с UTF-8, если файл в ANSI
3. На мой взгляд,
Vavlojin действительно выявил баг, но самую малость его "не докрутил" (или постеснялся прямо сказать), а своим предложением только подпустил туману. Суть же бага в том, что MarsNotebook в одних местах при записи (и чтении) в свой ini использует для национального алфавита однобайтный ANSI (например при записи путей типа LastDatabase/DirBackup/[Recent]File1), а в "других" ([Styles]Style1_name) двухбайтный юникод.
В результате, например, одна и та же фраза [Мои документы] будет представлена в ini-файле РАЗНЫМИ ПОСЛЕДОВАТЕЛЬНОСТЯМИ БАЙТ!
- в 1-ом случае: [CC EE E8 20 E4 EE EA F3 EC E5 ED F2 FB]
- во 2-м случае: [D0 9C D0 BE D0 B8 20 D0 B4 D0 BE D0 BA D1 83 D0 BC D0 B5 D0 BD D1 82 D1 8B]
Пока в ini никто кроме самого MarsNotebook "не лезет", все идет гладко (Mars "знает" какую строку и как читать). Но когда ini редактируется любым внешним текстовым (не HEX) редактором, то этот редактор вправе считать, что весь файл должен быть в одной кодировке, а не только "отдельные его части". Отсюда баги двойного преобразования. Редактор "определяет" исходную кодировку файла (выбирает наиболее подходящую) как ANSI, затем преобразовывает файл в памяти в свое внутреннее представление (в юникод), а при сохранении выполняет обратное преобразование текста в "исходную" кодировку.
Справедливости ради нужно отметить, что некоторые редакторы, более "продвинутые" чем стандартный блокнот, все же справляются с задачей двойного преобразования "получше", но и только. Полноценно "прочесть и наглядно отредактировать" юникодную строку и у них не получится (попробуйте-ка прочесть такую фразу [РњРѕРё документы]).