我认为可以肯定地说,C语言环境被普遍认为是一个坏主意。
如果您必须考虑将语言环境设置为而不是,那么编写使用C标准库函数尝试解析或编写基于文本的机器格式(这种情况经常发生)的应用程序几乎是不可能的"C"
。由于语言环境通常是每个进程使用的(并且setlocale
通常不是线程安全的),因此,如果您正在编写库或拥有多线程程序,那么即使在完成工作setlocale(LC_ALL, "C")
后再进行恢复也是不安全的。
现在,由于这些原因,规则通常是“ avoid setlocale
,period”;但是:过去,我们已经被QCoreApplication
和派生类的特殊行为所困扰;该文件说:
在Unix / Linux上,Qt默认配置为使用系统区域设置。当使用POSIX函数时,例如在浮点数和字符串之类的数据类型之间进行转换时,这可能会导致冲突,因为在不同的语言环境中符号可能会有所不同。要解决此问题,请
setlocale(LC_NUMERIC,"C")
在初始化后立即调用POSIX函数,QApplication
或QCoreApplication
将用于数字格式设置的语言环境重置为“ C”语言环境。
另一个问题描述了这种行为; 我的问题是:这种看似愚蠢的行为的原理是什么?特别是,在Unix和Linux上有什么特别之处导致仅在这些平台上做出了这样的决定?
(顺便说一句,如果我setlocale(LC_ALL, "C");
创建完之后只是这样做,一切都会中断QApplication
吗?如果还好,为什么不删除它们setlocale(LC_ALL, "");
呢?)
通过对@Phil Armstrong和我进行的Qt源代码的调查(请参阅聊天记录),似乎setlocale
从第1版开始就存在该调用,原因如下:
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] 删除。
我来说两句