Как сделать русские буквы видимыми в диалоге IUP, загруженном из файла LED?

Как я могу сделать русские буквы видимыми в диалоге, загруженном из файла LED?

  • Когда светодиодный файл является Unicode, IupLoad() возвращает ошибку.

  • Когда файл светодиода - UTF-8, IUP считает, что он загрузился и отобразил диалоговое окно, но есть только вакуум.

  • Когда светодиодный файл имеет формат ANSI, мы получаем предсказуемый результат:

Два анимированных выпадающих элемента в диалоге с плохо закодированными русскими и хорошо закодированными голландскими местоимениями

(Проигнорируйте красную коробку, я поместил ее там для другого вопроса.)

C файл:

#include <stdlib.h>
#include <iup.h>

int main(int argc, char **argv)
{
  IupSetGlobal("UTF8MODE", "YES");
  // IupSetGlobal("UTF8MODE_FILE", "YES");
  IupOpen(&argc, &argv);
  if(IupLoad("dropdown.led")) IupMessage("Error", "Failed to load LED.");
  else {
    Ihandle *dropdown = IupGetHandle("dropdown");
    IupShow(dropdown);
    IupMainLoop();
  }
  IupClose();
  return EXIT_SUCCESS;
}

Сопутствующий dropdown.led файл:

dropdown = DIALOG[TITLE=dropdown.led](
  HBOX[CMARGIN=10x10,CGAP=10](
    LIST[VALUE=3, 1=я, 2=ты, 3=оно, 4=мы, 5=вы, 6=они, DROPDOWN=YES](do_nothing),
    LIST[VALUE=3, 1=ik, 2=je, 3=hij, 4=we, DROPDOWN=YES](do_nothing)
  )
)

Обновление: эксперимент с ручной загрузкой светодиодного файла

Я попытался обойти это путем загрузки файла светодиодов вручную (моя функция LoadLED() ниже) и замена IupLoad() с IupLoadBuffer(), Однако это тоже не удалось, хотя, как ни странно, наоборот:

  • Когда файл светодиода - Unicode, IUP считает, что он загрузил и показал диалоговое окно, но есть только вакуум.

  • Когда светодиодный файл UTF-8, IupLoadBuffer() возвращает ошибку.

IupLoadBuffer() устраняет неисправное нежелательное поведение IupLoad() в отношении UTF-8 и Unicode - но это ошибочно, но желаемый результат все еще не достигнут.

IupMessage() подтверждает, что действует режим UTF-8: он правильно отображает русские буквы в файле светодиодов (UTF-8). Это показывает, что проблема локализована в IupLoad() а также IupLoadBuffer() функции, а не что-то вызванное моей некомпетентностью. (В конце концов, это было не то, что другое: функции работают должным образом, но у меня не было возможности узнать конкретные условия, необходимые для их работы.)

Модифицированный файл C:

#include <stdio.h>
#include <stdlib.h>
#include <iup.h>

char *LoadLED(char *buffer, size_t size, char *ledFileName) {
    FILE *led;
    if (led = fopen(ledFileName, "rb")) /* Binary mode for UTF-8! */ {
        fread(buffer, 1L, size, led);
        fclose(led);
        IupMessage("Loaded LED file", buffer);
        return buffer;}
    else return IupMessage("Error", "Failed to load LED."), NULL;
}

int main(int argc, char **argv) {
    IupSetGlobal("UTF8MODE", "YES");
    IupSetGlobal("UTF8MODE_FILE", "YES");
    IupOpen(&argc, &argv);

    char buffer[20000L], ledFileName[] = "dropdown.led";
    if (!LoadLED(buffer, sizeof(buffer), ledFileName)) return EXIT_FAILURE;
    if (IupLoadBuffer(buffer))
        return IupMessage("Error", "Failed to load buffer."), EXIT_FAILURE;
    else {
        Ihandle *dropdown = IupGetHandle("dropdown");
        IupShow(dropdown);
        IupMessage("Success", "IUP thinks it has loaded buffer and displayed dialog.");
        IupMainLoop();
    }
    return IupClose(), EXIT_SUCCESS;
}

Все вопросы, которые относятся к этому конкретному примеру:

  1. Как получить доступ к элементам графического интерфейса в диалоге IUP, загруженном из файла светодиода?
  2. Как сделать русские буквы видимыми в диалоге IUP, загруженном из файла LED? (ток)
  3. Пробел в выпадающих списках IUP

1 ответ

Решение

Во-первых, IUP НЕ поддерживает Unicode. Так что проверять бесполезно.

UTF8MODE_FILE для имен файлов. Не влияет на этот случай.

Строка UTF-8 может влиять на светодиодный парсер, хотя не должна. Убедитесь, что светодиодный файл НЕ имеет спецификации UTF-8. Я протестировал здесь ваш светодиодный файл, и он работает с использованием IupLoad или IupLoadBuffer, но в обоих случаях возникают проблемы со строками.

Решение на самом деле простое, просто заключите строки в кавычки "", например:

LIST[VALUE=3, 1="я", 2="ты", 3="оно", 4="мы", 5="вы", 6="они", DROPDOWN=YES](do_nothing),

Оно работает.

Другие вопросы по тегам