去年用vc給客戶開發(fā)了一套基于pdf文檔的數(shù)字圖書館,界面顯示都是古漢語,要求支持unicode5.0標準,在頁面上能顯示7萬多漢字,包括四字節(jié)漢字,終于在費了九牛二虎之力后在中文操作系統(tǒng)下沒有任何問題。
今年客戶要賣給日本用戶 ,因為編程用的好多技術都來源于原來的一個開發(fā)項目,基于多字節(jié)的編碼,也就是本地編碼,在日文系統(tǒng)下顯示漢字就成了亂碼。在日文系統(tǒng)下把語言環(huán)境修改成中文就沒有任何問題,但是日本人不愿意。
怎么解決這個問題,把程序的編碼轉換成unicode編碼,是一個辦法,但是非常麻煩,包括加密系統(tǒng)在內(nèi)的都要轉換,絕對是一個杯具了。在網(wǎng)上查詢后,有價值的資料不多。經(jīng)過自己的多次試驗終于解決了這個問題,現(xiàn)在拿出來跟大家分享一下,如果碰到與我有同樣困擾的朋友,相信還是有參考價值的。
我的解決思路是,將軟件中需要顯示的中文轉成UTF-8編碼,然后再轉Unicode編碼,用unicode編碼再轉為系統(tǒng)的本地編碼,非常簡單,原來的程序幾乎不需要修改多少,就把問題解決了。
轉換代碼想必大家應該比較熟悉了,就是用API函數(shù) MultiByteToWideChar了。
// UTF8轉換為Unicode字符串,再轉本地字符串
//szchar待轉換的漢字的utf-8編碼字符串
//wszUniCode 轉換后的Unicode編碼字符串
CString CDemoView::UTF8ToUni(char* szchar)
{
//先計算轉換后的unicode字符串的長度
int len;
len = MultiByteToWideChar(CP_UTF8, 0, szchar, -1, NULL,0);
// 分配Unicode字符串緩沖區(qū),并賦0
wchar_t* wszUniCode = new wchar_t[len+1];
memset(wszUniCode, 0, len * 2 + 2);
// 轉換過程
MultiByteToWideChar(CP_UTF8, 0, szchar, -1, wszUniCode, len);
//本地化
CString str(wszUniCode);
delete[] wszUniCode;
return str;
}
代碼很簡單,主要是提供一種解決思路。