如何在从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文件(我的函数LoadLED()
下方)并将IupLoad()
替换为IupLoadBuffer()
的形式的解决方法。然而,这也失败了,虽然 - 奇怪的是 - 反之亦然:
当LED文件是 Unicode时, IUP 相信它已加载并且 显示对话框,但只有真空。
当LED文件 UTF-8时, IupLoadBuffer()
会返回错误。
IupLoadBuffer()
撤消IupLoad()
关于UTF-8和Unicode的错误的 行为 不是理想的结果。
IupMessage()
确认UTF-8模式有效:它正确显示LED文件(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;
}
答案 0 :(得分:2)
首先,IUP不支持Unicode。所以测试它是没用的。
UTF8MODE_FILE用于文件名。不影响这种情况。
UTF-8字符串可能会影响LED解析器,尽管它们不应该。确保LED文件没有UTF-8 BOM。我在这里测试了你的LED文件,它使用IupLoad或IupLoadBuffer工作,但在这两种情况下都存在字符串问题。
解决方案实际上很简单,只需用引号“”包装你的字符串,例如:
LIST[VALUE=3, 1="я", 2="ты", 3="оно", 4="мы", 5="вы", 6="они", DROPDOWN=YES](do_nothing),
有效。