为什么QCoreApplication在Unix / Linux上默认调用`setlocale(LC_ALL,“”)`?

Matteo意大利

我认为可以肯定地说,C语言环境被普遍认为是一个坏主意。

如果您必须考虑将语言环境设置为而不是,那么编写使用C标准库函数尝试解析或编写基于文本的机器格式(这种情况经常发生)的应用程序几乎是不可能的"C"由于语言环境通常是每个进程使用的(并且setlocale通常不是线程安全的),因此,如果您正在编写库或拥有多线程程序,那么即使在完成工作setlocale(LC_ALL, "C")后再进行恢复也是不安全的

现在,由于这些原因,规则通常是“ avoid setlocale,period”;但是:过去,我们已经被QCoreApplication和派生类的特殊行为所困扰;文件说:

在Unix / Linux上,Qt默认配置为使用系统区域设置。当使用POSIX函数时,例如在浮点数和字符串之类的数据类型之间进行转换时,这可能会导致冲突,因为在不同的语言环境中符号可能会有所不同。要解决此问题,请setlocale(LC_NUMERIC,"C")在初始化后立即调用POSIX函数QApplicationQCoreApplication将用于数字格式设置的语言环境重置为“ C”语言环境。

另一个问题描述了这种行为; 我的问题是:这种看似愚蠢的行为的原理是什么?特别是,在Unix和Linux上有什么特别之处导致仅在这些平台上做出了这样的决定?

(顺便说一句,如果我setlocale(LC_ALL, "C");创建完之后只是这样做,一切都会中断QApplication吗?如果还好,为什么不删除它们setlocale(LC_ALL, "");呢?)

Matteo意大利

通过对@Phil Armstrong和我进行的Qt源代码的调查(请参阅聊天记录),似乎setlocale从第1版开始就存在调用,原因如下:

  • 至少在古代,XIM在没有这样的调用的情况下无法正确地“获取”当前语言环境。
  • 在Solaris上,它甚至使用默认的C语言环境崩溃。
  • 在Unix系统上,它(在其他系统中,在一个复杂的后备游戏中)用于“嗅探”“系统字符集”(在Unix上意味着什么),因此能够在QString表示形式和“本地”之间进行转换。8位编码(这对于文件路径尤为重要)。

确实,它已经检查了LC_*环境变量,就像它与一样QLocale,但是我想如果应用程序显式更改nl_langinfo了当前值,LC_CTYPE对它进行解码可能会很有用(但要查看是否有显式更改,就必须以它开头系统默认值)。

有趣的是,他们做了一个setlocale(LC_NUMERIC, "C")后立即setlocale(LC_ALL, ""),但是这是在Qt的4.4去除做出此决定的理由似乎在于旧的Qt bugtracker的任务#132859(该任务在TrollTech,Nokia和QtSoftware.com之间移动,然后消失而没有留下任何痕迹,甚至在Wayback Machine中也没有),并且在两个 bug中引用了该问题。关于这个话题。我认为存在有关该主题的权威答案,但我找不到恢复它的方法。

我的猜测是,它引入了一些细微的错误,因为环境似乎是原始的,但实际上setlocale,除LC_NUMERIC类别(最明显)之外的所有类别调用都对它产生了影响。可能他们删除了该调用以使语言环境设置更明显,并使应用程序开发人员采取相应行动。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么LC_ALL setlocale设置会影响Powershell中的cout输出?

来自分类Dev

在Solaris上设置LC_ALL的含义是什么

来自分类Dev

为什么Python会忽略LC_ALL?

来自分类Dev

Ubuntu没有设置LC_ALL,为什么?

来自分类Dev

“ LC_ALL = C”是做什么的?

来自分类Dev

QCoreApplication :: processEvents-为什么必须仅从主线程调用它?

来自分类Dev

LC_ALL = C中的C是什么意思?

来自分类Dev

为什么linux / unix缺少UI?

来自分类Dev

LC_ALL = C已设置,不知道为什么

来自分类Dev

为什么不能在语言环境中设置LC_ALL的值?

来自分类Dev

警告:setlocale:LC_ALL:无法更改语言环境

来自分类Dev

为什么允许创建多个QCoreApplication对象?

来自分类Dev

为什么Linux不遵循Unix syscall约定?

来自分类Dev

为什么Linux不遵循Unix syscall约定?

来自分类Dev

为什么在Unix / Linux中存在超级用户?

来自分类Dev

为什么*在整个Internet上都提到Unix?

来自分类Dev

LANG = C和LC_ALL = C有什么区别?

来自分类Dev

为什么Unix / Linux系统上最强大的用户称为“ root”?

来自分类Dev

“ -bash:警告:setlocale:LC_ALL:无法更改语言环境(en_US.UTF-8)”

来自分类Dev

如果Linux的内核是单片的,那么为什么Linux是“类Unix”的呢?

来自分类Dev

为什么UNIX / POSIX系统调用命名如此难以理解?

来自分类Dev

为什么Unix / Linux系统不遍历目录,直到找到所需的链接库版本?

来自分类Dev

为什么Unix / Linux系统不遍历目录,直到找到所需的链接库版本?

来自分类Dev

为什么在UNIX / Linux中不允许对目录的硬链接?

来自分类Dev

为什么Windows不能使Unix / Linux没有恶意软件?

来自分类Dev

为什么Unix/Linux系统还需要依赖微软?

来自分类Dev

为什么Kafka docker需要在Unix套接字上侦听

来自分类Dev

为什么在Unix文件系统上以文件模式需要“执行”位?

来自分类Dev

为什么“二进制访问在UNIX系统上毫无意义”?

Related 相关文章

  1. 1

    为什么LC_ALL setlocale设置会影响Powershell中的cout输出?

  2. 2

    在Solaris上设置LC_ALL的含义是什么

  3. 3

    为什么Python会忽略LC_ALL?

  4. 4

    Ubuntu没有设置LC_ALL,为什么?

  5. 5

    “ LC_ALL = C”是做什么的?

  6. 6

    QCoreApplication :: processEvents-为什么必须仅从主线程调用它?

  7. 7

    LC_ALL = C中的C是什么意思?

  8. 8

    为什么linux / unix缺少UI?

  9. 9

    LC_ALL = C已设置,不知道为什么

  10. 10

    为什么不能在语言环境中设置LC_ALL的值?

  11. 11

    警告:setlocale:LC_ALL:无法更改语言环境

  12. 12

    为什么允许创建多个QCoreApplication对象?

  13. 13

    为什么Linux不遵循Unix syscall约定?

  14. 14

    为什么Linux不遵循Unix syscall约定?

  15. 15

    为什么在Unix / Linux中存在超级用户?

  16. 16

    为什么*在整个Internet上都提到Unix?

  17. 17

    LANG = C和LC_ALL = C有什么区别?

  18. 18

    为什么Unix / Linux系统上最强大的用户称为“ root”?

  19. 19

    “ -bash:警告:setlocale:LC_ALL:无法更改语言环境(en_US.UTF-8)”

  20. 20

    如果Linux的内核是单片的,那么为什么Linux是“类Unix”的呢?

  21. 21

    为什么UNIX / POSIX系统调用命名如此难以理解?

  22. 22

    为什么Unix / Linux系统不遍历目录,直到找到所需的链接库版本?

  23. 23

    为什么Unix / Linux系统不遍历目录,直到找到所需的链接库版本?

  24. 24

    为什么在UNIX / Linux中不允许对目录的硬链接?

  25. 25

    为什么Windows不能使Unix / Linux没有恶意软件?

  26. 26

    为什么Unix/Linux系统还需要依赖微软?

  27. 27

    为什么Kafka docker需要在Unix套接字上侦听

  28. 28

    为什么在Unix文件系统上以文件模式需要“执行”位?

  29. 29

    为什么“二进制访问在UNIX系统上毫无意义”?

热门标签

归档