在寫Qt時候遇到問題實在搞太久了,把他記錄起來以免忘記!
1.不同system的locale會不同(中文windows vs 英文windows),因此搭配
QTextCodec::setCodecForLocale會有所不同,toLocal8bit()亦同
2.Latin1 其實就是ISO 8859-1
3.toLocal8bit()會因為locale而有所不同:
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
通常會有所不同,但如果是填utf8的話就跟.toUtf8()是一樣的功能囉!
4.QString內部就是Unicode編碼(最大相容於各系統),因此如果要從QString取出東西,通常都會使
用fromUnicode()
--------------------------------------------------------------------------------------------------------------------------
使用QString -->UTF8 則使用toUtf8()即可
使用QString -->Big5 (中文系統) 使用toLocal8bit()即可
使用QString -->Big5(英文系統) ???? 翻遍網路都沒有找到,這個問題搞了兩天,終於....
使用系統: Windows POS Ready 2009 English version 2 SP3
使用語言: Qt(類C)
首先,必須要了解的是一個中文 = 兩組碼 ,一個英文 = 一組碼,如果要中英混合的話呢?
這邊我利用toUtf8()來分析length判斷目前字元是中文還是英文
(先用QString的mid()切割每一個字元)
中文的解決方法比較麻煩,英文則相較簡單。
//英文or符號
QString str2 = str_Trans.mid(i,1);
QByteArray byte_array = str2.toLatin1();
unsigned char command_english[str2.length()];
memcpy(command_english,byte_array,str2.length());
透過toLatin1()就可以把QString轉為QByteArray,再用memcpy copy進去就可以囉!
中文:
QTextCodec *codec = QTextCodec::codecForName("Big5");
QByteArray b_array = codec->fromUnicode(str_Trans);
unsigned char command_chinese[4];
memcpy(command_chinese,b_array,4);
for(int i = 0 ; i< sizeof(b_array); i++)
{
int tmp = (int)command_chinese[i];
qDebug()<<tmp;
}
透過codec的fromUnicode來轉碼,轉完就變成QByteArray,一樣透過memcpy copy
這邊如果run到沒有安裝Qt的系統(或電腦)一下就會Crash,why ??
一開始上網查,結果查到都是qcncodec4.dll (這是給簡體字的GBK,GB....),繁體必須用
qtwcodec4.dll,放進去創建的Plugins/Codecs裡面,結果!!還是Crash!!
後來把lib檔(.a)跟dll檔(.dll)整個資料夾都Copy進去以後就可以了~
至於要放在哪邊呢? 放在你的.exe檔同一個資料夾即可
*********************************************************************************
不要再相信網路上加上
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
類似這種(UTF-8換GBK,GB2312之類的)
就可以跑這種奇怪的解法,好好去了解這些編碼才是實際。
Unicode可以容納最多編碼方式
UTF-8則是unicode的一種表現方式
Latin1是歐美編碼
Big5是繁中
簡體則有許多GBK,GB2312...之類的
CSDN上這篇 也解釋得不錯,可以參考看看
希望下一個遇到Unicode to Big5的人可以順利解決
沒有留言:
張貼留言