Борьба с крякозябликами. Часть вторая
Борьба с крякозябликамиЕще один примерчик. Здесь уже пришлось вникать в работу шрифтов. Сильно не расписывал,
-
Оффлайн
Звание: Ветеран
Команда сайта
Сообщений: 945
Создано тем: 79
Рейтинг: 8
Репа: (131|131|0)
Баллы: 1676
Был: 2024-07-28 22:59
Лайков: 167
Цитата: Alecs962... при переводе в файле SMARTDesc.csv появляются кракозябры... Кодировка файлов разная - SMARTDesc.csv в UTF-8, а остальные в Юникоде. Есть ли решение этой проблемы?
Корень проблемы находится в исполняемом файле программы — DiskCheckup.exe. Считывание файла SMARTDesc.csv выполняется в кодировке ANSI. Затем строки преобразуются в кодировку Unicode по упрощенному алгоритму. Как известно, коды символов в диапазоне 00-7F (латиница) для таблиц ASCII и Unicode абсолютно одинаковые, поэтому в программе код символа в кодировке Unicode получается дополнением кода символа в кодировке ASCII нулевым байтом. Например, символ "W" в наборе ASCII имеет код 0х57, а в наборе Unicode — 0х5700. В то время как, например, кириллический символ "М" имеет код 0хСС, то по упрощенному алгоритму он превращается в символ Unicode вида 0хСС00. Но на самом деле код русской буквы "М" в кодировке Unicode должен быть 0х1С04.
Таким образом, чтобы избавиться от "кракозябр", необходимо модифицировать алгоритм перекодировки. Что мы сделаем: добавляем проверку вхождения кода символа в диапазон 7F-FF. Если это условие выполняется, то по упрощенному алгоритму конвертируем код символа в кодировку Unicode для диапазона кириллицы.
Данные патча для файла DiskCheckup.exe v3.4.1003.0 (в отладчике x64Dbg):
Далее, кодировку файла SMARTDesc.csv необходимо изменить на ANSI (Windows-1251), обязательно. Также, при переводе содержимого файла, все строки с подсказками нужно заключить в двойные кавычки ( " ). Если внутри строки какое-либо выражение должно быть указано в кавычках, то вместо двойных кавычек используйте одинарные ( " ) или удвоенные одинарные ( "" ). Но ни в коем случае не используйте альтернативные варианты кавычек, типа « » или “ ”. Эти символы находятся во второй половине таблицы ASCII и при конвертации (по упрощенной схеме) в Unicode, для диапазона кириллицы, превращаются в "мусор".
В результате, если все сделано правильно, вы получите корректное отображение символов кириллицы для текста подсказок.12 февраля 2017 - 15:35 / #21 -
Цитата: LesergКорень проблемы находится в исполняемом файле программы.....
Огромное СПАСИБО Вам! Честно говоря именно Ваш ответ я ждал, в заковыристых ситуациях, продолжением которых идет ковыряние в коде программы только Ваша подсказка помогает решить проблему.12 февраля 2017 - 17:13 / #22 -
Цитата: dinis124Кодировка 1252 в шестнадцатеричном значении выглядит как 4E4
А нет типа таблицы как выглядят другие кодировки в шестнадцатеричном значении?6 марта 2022 - 15:15 / #23 -
Оффлайн
Звание: Эксперт
Мастер
Сообщений: 532
Создано тем: 52
Рейтинг: 6
Репа: (269|269|0)
Баллы: 2551
Страна: не указана!
Был: 2024-11-20 20:43
Лайков: 264
Цитата: DodakaedrА нет типа таблицы как выглядят другие кодировки в шестнадцатеричном значении?Внимание! У вас нет прав для просмотра скрытого текста.Dodakaedr нравится это сообщение.8 марта 2022 - 14:21 / #24
Статистика форума, пользователей онлайн: 0 (за последние 20 минут)
---
- Создано тем
- 1197
- Всего сообщений
- 15762
- Пользователей
- 18014
- Новый участник
- Markhabayev