0

如何在从 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;
}

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

  1. 如何访问从 LED 文件加载的 IUP 对话框中的 GUI 元素?
  2. 如何在从 LED 文件加载的 IUP 对话框中显示俄语字母?(当前的)
  3. IUP 下拉列表中的空白
4

1 回答 1

3

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

有用。

于 2017-04-17T16:05:20.993 回答