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