在Qt中,如何全局设置CodeCForCStrings(在标题中)?

时间:2012-07-08 15:21:29

标签: qt utf-8 qstring

我正在用C ++开发一堆Qt应用程序,它们都使用一些模块(翻译单元)来实现使用Qt的常用功能。

每当我将C字符串(隐式转换)或C ++字符串对象(fromStdString())转换为QString对象时,我希望原始数据为UTF-8编码,反之亦然(toStdString())。

the default is Latin-1开始,我必须将编解码器“手动”(在我的每个程序的init过程中)设置为UTF-8:

  

QTextCodec来:: setCodecForCStrings(QTextCodec来:: codecForName( “UTF8”));

并非所有模块都有init过程。包含类的那些(我可以将这一行放在类构造函数中),但是一些模块只包含一个包含许多函数的命名空间。所以setCodecForCStrings()没有地方。每当我隐式地(从我的一个模块中)转换/到QString时,我依赖于已经由主程序的init过程设置的编解码器,这似乎是一个相当糟糕的解决方案。

在我的模块中是否有可靠的方法将编解码器设置为UTF-8 ,或者我必须非常小心,根本不要使用隐式转换(至少在我的模块中)写一些像std :: string(q.toUtf8()。constData())而不是q.toStdString()?

1 个答案:

答案 0 :(得分:3)

这可以使用类定义来实现自动实例化的单例类似的类,在其构造函数中有一些init代码:

class ModuleInit {
    static ModuleInit *instance;
public:
    ModuleInit() {
        QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf8"));
    }
};
ModuleInit * ModuleInit::instance = new ModuleInit(); // put this line in .cpp!

将此代码放在任何项目中将把文本编解码器设置为UTF-8。但是,您可以覆盖main()方法中的文本编解码器,因为上面的代码甚至在 main()方法之前执行

使用“任何地方”我当然意味着在语法上允许的地方。将类定义放在某个头文件中,并将实例化放在适当的.cpp文件中。

你甚至可以将整个代码放在一个.cpp文件中,比如你编译和链接的moduleinit.cpp,但是从不显式使用(你可以包含没有头文件.. )。这也可以避免意外的实例化,除了第一个,你不会有任何重复类名的问题。

请注意,您无法在一个特定文件中设置C字符串的编解码器。使用QTextCodec::setCodecForCString设置编解码器将在应用程序范围内设置它!