如果使用QtCreator進行開發(fā),那么一旦代碼中需要使用到中文字面字符串的時候旋奢,很大可能會遇到亂碼的問題泳挥,當前網上有很多文章,大多數(shù)都是針對Qt4而言的黄绩,給的解決方案是設置字符編碼集羡洁,然后用tr包裹字面字符串等。
但是爽丹,從Qt5開始筑煮,由于Qt5對以const char*參數(shù)構造的QString,會默認該const char*是utf-8編碼粤蝎,再配合vs2013以上的版本真仲,我們有了新的更簡單的中文字符串處理方案。
首先初澎,要先了解下面兩個概念:
source-charset:源碼字符集秸应,即我們的源代碼文件使用的編碼
execution-charset:執(zhí)行字符集,編譯器存儲字面字符串時使用的編碼
既然Qt5開始碑宴,QString默認把字面字符串當utf-8編碼進行轉換软啼,那么我們的源碼字符集,即源文件最好也保持一致延柠,使用utf-8編碼祸挪。這里值得注意的是,utf-8編碼的文件可以帶bom頭也可以不帶bom頭贞间,但是由于vc處理源碼的時候贿条,只有帶bom頭的文件才會被正確當作utf-8編碼的文件看待,而無bom頭則認為是本地默認編碼增热。所以我們的源碼文件必需統(tǒng)一使用帶bom頭的utf-8格式整以,這里QtCreator提供對應的設置讓我們在生成源碼文件的時候會使用這種格式。
接下來峻仇,就是要處理執(zhí)行字符集的問題公黑,我們需要把vc的執(zhí)行字符集也設置為utf-8,這樣所有的字面字符串保存的編碼都會是utf-8础浮,就可以和QString無縫結合了帆调。
vc2013的設置方法是通過預處理命令
#pragma execution_character_set("utf-8")
vc2015之后,上述的預處理命令的方式過時了豆同,微軟建議編碼器的編譯參數(shù)中使用/utf-8來完成設置
補充:
因為QString內部是使用Unicode的番刊,所以如果我們的字面字符串是utf-8編碼的話,是需要多一道轉換的過程影锈。
我們也可以使用C++11的特性芹务,如給字面字符串加u前綴蝉绷,這樣就可以不用多這個轉換的過程,更好的方式是用Qt5開始提供的QStringLiteral宏來包裹我們的字面字符串枣抱,這樣更加高效熔吗。