Qt是否强制系统区域设置?

时间:2016-01-19 13:21:28

标签: qt locale

以下示例似乎显示了Qt中的错误。或者我错了?

@Override
public void declareOutputFields(OutputFieldsDeclarer ofd) {
    Fields respFields = IoTFields.getKafkaResponseFieldsRTEXY();
    ofd.declareStream(IoTStreamID.KAFKARESP.name(), respFields);
}

@Override
public void execute(Tuple tuple, BasicOutputCollector collector) {
    List<Object> newTuple = new ArrayList<Object>() ;
    String params  = tuple.getStringByField("params") ;
    newTuple.add(3, params);
    ----
    collector.emit(IoTStreamID.KAFKARESP.name(), newTuple);
}

使用非标准语言环境时,在我的示例fr_FR.UTF-8中,创建QApplication似乎更改了系统语言环境,因为atof用它来进行转换。

对我而言,看起来QApplication的创建将拉动系统区域设置并用它调用setenv。

2 个答案:

答案 0 :(得分:5)

来自Qt文档

  

区域设置

     

在Unix / Linux上,Qt配置为默认使用系统区域设置。   例如,当使用POSIX函数时,这可能会导致冲突   在数据类型(如浮点数和字符串)之间进行转换时,因为区域设置之间的符号可能不同。   要解决此问题,请调用POSIX函数setlocale(LC_NUMERIC,&#34; C&#34;)   在初始化QApplication或QCoreApplication之后,将用于数字格式的区域设置重置为&#34; C&#34; -locale。

答案 1 :(得分:3)

  

对我而言,看起来QApplication的创建将拉动系统区域设置并用它调用setenv。

不,it will call setlocale

void QCoreApplicationPrivate::initLocale()
{
    if (qt_locale_initialized)
        return;
    qt_locale_initialized = true;
#if defined(Q_OS_UNIX) && !defined(QT_BOOTSTRAPPED)
    setlocale(LC_ALL, "");
#endif
}

反过来从环境变量中获取区域设置,作为空字符串stands for the user-preferred locale。否则,您将使用C语言环境。