Борьба с крякозябликами. Часть вторая

Борьба с крякозябликамиЕще один примерчик. Здесь уже пришлось вникать в работу шрифтов. Сильно не расписывал,
  1. Оффлайн

    Leserg

    Звание: Ветеран

    Команда сайта

    Сообщений: 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, для диапазона кириллицы, превращаются в "мусор".

    В результате, если все сделано правильно, вы получите корректное отображение символов кириллицы для текста подсказок.

    Сообщение отредактировал 27 января 2021 - 13:54

    Кто ищет, тот всегда найдет!

    12 февраля 2017 - 15:35 / #21
  2. Оффлайн

    Alecs962

    Звание: Сталкер

    Команда

    Сообщений: 101

    Создано тем: 5

    Рейтинг: 3

    Репа: (6|6|0)

    Баллы: 51

    Страна: не указана!

    Был: 2019-06-15 18:21

    Лайков: 1

    Цитата: Leserg
    Корень проблемы находится в исполняемом файле программы.....



    Огромное СПАСИБО Вам! Честно говоря именно Ваш ответ я ждал, в заковыристых ситуациях, продолжением которых идет ковыряние в коде программы только Ваша подсказка помогает решить проблему.
    12 февраля 2017 - 17:13 / #22
  3. Оффлайн

    Dodakaedr

    Звание: Новичок

    Проверенные

    Сообщений: 48

    Создано тем: 0

    Рейтинг: 2

    Репа: (1|1|0)

    Баллы: 56

    Был: 2024-11-10 18:55

    Лайков: 1

    Цитата: dinis124
    Кодировка 1252 в шестнадцатеричном значении выглядит как 4E4


    А нет типа таблицы как выглядят другие кодировки в шестнадцатеричном значении?
    6 марта 2022 - 15:15 / #23
  4. Оффлайн

    78Sergey

    Звание: Эксперт

    Мастер

    Сообщений: 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