如何在从LED文件加载的IUP对话框中显示俄文字母?

时间:2017-04-17 10:49:09

标签: iup

如何在从LED文件加载的对话框中显示俄文字母?

  • 当LED文件 Unicode时, IupLoad()会返回错误。

  • 当LED文件 UTF-8时, IUP 认为已加载并且 显示对话框,但只有真空。

  • 当LED文件为 ANSI 时,我们会得到可预测的结果:

Two animated dropdown elements in a dialog with ill-encoded Russian and well-encoded Dutch pronouns

(忽略红色框,我把它放在另一个问题上。)

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()撤消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;
}

与此特定示例相关的所有问题:

  1. How do I get access to GUI elements in a IUP dialog loaded from a LED file?
  2. How can I make Russian letters visible in a IUP dialog loaded from a LED file?(当前)
  3. A gap in IUP dropdown lists

1 个答案:

答案 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),

有效。