Как сделать русские буквы видимыми в диалоге 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 НЕ поддерживает Unicode. Так что проверять бесполезно.
UTF8MODE_FILE для имен файлов. Не влияет на этот случай.
Строка UTF-8 может влиять на светодиодный парсер, хотя не должна. Убедитесь, что светодиодный файл НЕ имеет спецификации UTF-8. Я протестировал здесь ваш светодиодный файл, и он работает с использованием IupLoad или IupLoadBuffer, но в обоих случаях возникают проблемы со строками.
Решение на самом деле простое, просто заключите строки в кавычки "", например:
LIST[VALUE=3, 1="я", 2="ты", 3="оно", 4="мы", 5="вы", 6="они", DROPDOWN=YES](do_nothing),
Оно работает.