【问题标题】:How do I remove the difference in locale between gui and commandline interfaces of same program?如何消除同一程序的 gui 和命令行界面之间的语言环境差异?
【发布时间】:2010-01-31 11:48:08
【问题描述】:

程序将设置文件保存为包含long double 类型的浮点数的文本。设置文件只能通过 GUI (GTK2) 保存,而文件也可以通过命令行加载,无需启动 GUI。

不幸的是,用户报告说,由于他的语言环境设置,在他保存的文件中,数字是用逗号格式化的,程序拒绝从命令行加载它们(发出错误消息),但似乎在GUI 已打开。

我已经问过以下问题:MPFR, printf, decimal places, locales, file i/o problem 建议使用setlocale(LC_ALL, "C"),我将它放在main 的开头。由于这不起作用,我在调用gtk_init_check 后放置了它,但同样,它没有任何区别。 (编辑在我安装了几个语言环境后确实有所不同。)

我希望程序对其保存的这些数据文件始终使用相同的语言环境设置(或非本地化语言环境设置 - “C”),但不希望这样做会弄乱 GUI。

怎么做?

【问题讨论】:

    标签: c linux command-line gtk locale


    【解决方案1】:

    根本不要使用区域设置敏感函数来保存和恢复值。例如使用 ieee754.h 保存和加载尾数和指数。

    【讨论】:

    • 您能否简要解释一下为什么我不应该保存/恢复语言环境设置?
    • 他不是这么说的。用于将数字打印到文件的区域设置敏感函数将根据区域设置格式化该数字,使用逗号等。无论您在哪个区域设置,区域设置不敏感函数将始终以相同的方式打印数字。始终使用区域设置-用户不会手动编辑的内部编写文件的不敏感函数。 (例如设置文件。)
    • 这些是配置文件。它们是机器可读的,机器真的不关心你的国家敏感性。使配置文件注释,人类可读和人类可编辑是对可用性和开放性的赞赏,但不是必不可少的。使配置文件本地化,包括实际配置数据的本地化格式是有害的,并且滥用“政治正确性”(正如您刚刚经历的那样)。 GUI 应该本地化。文本配置工具可以本地化。配置文件不应该。
    • 错了。我谈论的是系统头文件 ieee754.h,而不是标准的 ieee754.h。
    • 您需要 IEEE 标准 754-2008。 en.wikipedia.org/wiki/Quadruple_precision_floating-point_format 最后一个 gcc/glibc 用于编译。
    【解决方案2】:

    如果您只能将这些值存储为double,我会简单地建议使用 glib 的 ASCII 限制字符串格式化/解析函数:

    要将值转换为字符串,请调用@987654321@。反之,请使用@987654322@

    我意识到这可能很糟糕,因为您当然会从 long double 降低精度到普通的旧 (g)double。 glib 似乎不支持 long double 类型,你确定它真的给了你更高的精度吗?

    【讨论】:

    • Errh 绝对肯定...实际上有些浮点数使用 MPFR 库来获得更高的精度,并且 MPFR 函数的输出也有同样的问题。
    【解决方案3】:

    将使用的语言环境存储在加载/保存代码的顶部:

    char* loc = setlocale(LC_NUMERIC, NULL);
    

    然后对于您将数值写入文件调用的每个实例:

    setlocale(LC_NUMERIC, "C");
    /* code here for read/write of numeric values:
    fprintf(fd, "aspect %0.20lf\n", img->aspect);
    */
    setlocale(LC_NUMERIC, loc);
    

    应该做的伎俩。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-24
    • 2019-01-20
    • 2018-09-10
    • 1970-01-01
    • 2013-10-25
    • 2012-06-06
    • 2013-09-28
    • 2021-01-15
    相关资源
    最近更新 更多