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

How can I make Russian letters visible in a IUP dialog loaded from a LED file?

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

(忽略红框,我把它放在那里是为了另一个问题。)

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().然而,这也失败了,尽管——奇怪的是——相反:

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. (当前)

首先,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),

有效。