如何在从 LED 文件加载的对话框中显示俄语字母?
当 LED 文件为Unicode 时,
IupLoad()
返回错误。当 LED 文件为UTF-8 时, IUP认为它已加载并显示对话框,但只有真空。
当 LED 文件为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)
)
)
更新:手动加载 LED 文件的实验
我尝试了一种解决方法,即手动加载 LED 文件(我的功能LoadLED()
如下)并替换IupLoad()
为IupLoadBuffer()
. 然而,这也失败了,尽管——奇怪的是——反过来:
当 LED 文件为Unicode 时, IUP认为它已加载并显示对话框,但只有真空。
当 LED 文件为UTF-8 时,
IupLoadBuffer()
返回错误。
IupLoadBuffer()
扭转了关于 UTF-8 和 Unicode 的不良 不良行为IupLoad()
——但它仍然 不是理想的结果。
IupMessage()
确认 UTF-8 模式有效:它在 LED 文件 (UTF-8) 中正确显示俄语字母。它表明问题仅限于 (最后,两者都不是:功能按预期工作,但我无法知道使它们工作所需的具体条件。)IupLoad()
andIupLoadBuffer()
函数,而不是由于我的无能引起的。
修改后的 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;
}