作者:龍飛
3.1:GNU的libiconv項(xiàng)目
http://www.gnu.org/software/libiconv/ 再一次的,感謝偉大的GNU。我們需要的是Unicode碼,在程序中轉(zhuǎn)換,我們需要相應(yīng)的庫。libiconv支持許多字符集,包括我們將用到的GB2312,UTF-8和UCS-2(Unicode)。具體的,在項(xiàng)目主頁上有詳細(xì)的說明。我們需要新學(xué)習(xí)直接用的類容并不繁多,同樣的,如果你沒什么興趣自己編譯源代碼,可以直接用在win32下編譯好的頭文件,庫和動(dòng)態(tài)鏈接庫(DLL)。win32下的項(xiàng)目主頁是:
http://gettext.sourceforge.net/有趣的是,作者把它作為了我們前面提到的gettext的一部分。在下載頁面上,我們直接選擇
libiconv-win32,同樣的,我直接給出所需要的三部分文件的相關(guān)信息:
iconv.h:頭文件,請(qǐng)?jiān)贑++代碼中#include進(jìn)來;
iconv.lib:庫文件,在編譯時(shí)候使用;
iconv.dll:動(dòng)態(tài)鏈接庫,請(qǐng)放到exe文件能找到的路徑下(通常與exe在同一文件夾下面)
下面,我們看看libiconv的使用方法。
3.2:libiconv的演示程序
我們還是邊寫程序邊做說明:
#include <iostream>
#include <string>
#include <iomanip>
#include "GNU/iconv.h"
void showHex(int x);
<iomanip>和showHex函數(shù),是用來現(xiàn)實(shí)16進(jìn)制的。我們?cè)谇懊嬗眠^。
int main(int argc, char* argv[])
{
//src string
const std::string str = "你好";
//string size
const int STR_SIZE = 256;
//string to be changed
const unsigned char* src = (const unsigned char*)(str.c_str());
size_t src_len = strlen((char*)src);
//string after changed
unsigned char dst[STR_SIZE] = {0};
size_t dst_len = sizeof(dst);
//iconv's arg
const unsigned char* in = src;
unsigned char* out = dst;
std::cout << "src: " << src << std::endl;
我們用來轉(zhuǎn)換的字符串是“純中文”(為什么我要加引號(hào)重點(diǎn)說明,后面會(huì)有原因的解釋)"你好"。STR_SIZE是預(yù)留的轉(zhuǎn)換內(nèi)存空間。為什么不用動(dòng)態(tài)存儲(chǔ)呢?因?yàn)槲以囘^,有錯(cuò)誤,可能是iconv自身的限制。src是C風(fēng)格的源字符串,dst是轉(zhuǎn)換后的unsigned char數(shù)組。in和out是用于inconv的參數(shù)。
//GB2312 to UCS-2 (Unicode)
iconv_t cd;
cd = iconv_open("UCS-2", "GB2312");
if ((iconv_t)-1 == cd){
return -1;
}
iconv(cd, (const char**)&in, &src_len, (char**)&out, &dst_len);
iconv_close(cd);
這一段是編碼的轉(zhuǎn)換,詳細(xì)內(nèi)容請(qǐng)查閱iconv的doc。
//Unicode dst
std::cout << "dst: ";
int unicode_len = strlen((char*)dst);
for (int i = 0; i < unicode_len; i++) {
showHex(dst[i]);
}
std::cout << std::endl;
return 0;
}
void showHex(int x)
{
using namespace std;
cout << hex;
cout << "0x" << setw(4) << setfill('0') << x << " ";
cout << dec;
}
最后一部分是顯示轉(zhuǎn)換后代碼。包括函數(shù)showHex()。
3.3:iconv的問題。
我們似乎已經(jīng)解決問題了。但是有一個(gè)問題是,這樣轉(zhuǎn)換的編碼是8位的,即unsigned char,而SDL需要的是16位的,即Uint16;第二個(gè)問題是,我說了,這是純中文,你試試在“你”和“好”之間加段英語是什么效果?結(jié)論是,轉(zhuǎn)換不能正常進(jìn)行,在遇到第一個(gè)非漢字的時(shí)候,就終止了。
問題還是沒解決,研究還得繼續(xù)。
posted on 2008-03-30 12:45
lf426 閱讀(3134)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
SDL入門教程 、
跨平臺(tái)與GNU