前談過一篇關於linux下面unicode使用的文章。那個主要是針對多位元組和寬字元的轉換而談的。今天說的有些類似,主要是windows下面關於字元編碼轉換和linux下面的不同。
我移植的那部分程式中,有函式是用來實現utf-8和gbk之間的轉換的。其實其他很多不同型別的字元之間轉換都可以用這種方法。
先說windows。
因為windows
下面沒有函式可以實現這一功能,所以得自己寫。思路很簡單,就是利用之前講過的那兩個函式來實現,即:
multibytetowidechar
和widechartomultibyte
來實現。先將其中一種編碼(如
utf-8
)利用multibytetowidechar
轉換為寬位元組,然後再利用
widechartomultibyte
轉換為另一種編碼(如
gbk)。反過來也是一樣的。
下面給出**:
long utf8togbk(const void * lputf8str, string & str)
//獲取轉換到gbk編碼後所需要的字元空間長度
nretlen = ::widechartomultibyte(cp_acp, 0, lpunicodestr,
-1, null, null, null, null);
char *lpgbkstr = new char[nretlen + 1];
nretlen = ::widechartomultibyte(cp_acp, 0, lpunicodestr,
-1, (char *)lpgbkstr, nretlen, null, null);
//轉換到gbk編碼
if(!nretlen)
str = lpgbkstr;
delete lpunicodestr;
delete lpgbkstr;
return 0;
}
再來看linux
,它已經提供了函式可以實現這一功能,不僅如此,
linux
還可以實現批量檔案的字元編碼轉換呢。只不過在
linux
下面支援的字符集多少會和
windows
的不同,所以一定得先查字符集有哪些,再去使用函式。這裡推薦使用
locale –m
命令,得到的字符集比較全。
實現這一功能的正是
iconv
函式族,包含以下三個函式:
iconv_t iconv_open(const char *tocode, const char *fromcode);
此函式說明將要進行哪兩種編碼的轉換,
tocode
是目標編碼,
fromcode
是原編碼,該函式返回乙個轉換控制代碼,供以下兩個函式使用。
size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
此函式從
inbuf
中讀取字元,轉換後輸出到
outbuf
中,inbytesleft
用以記錄還未轉換的字元數,
outbytesleft
用以記錄輸出緩衝的剩餘空間。
int iconv_close(iconv_t cd);
此函式用於關閉轉換控制代碼,釋放資源。
下面給demo
**:
#include
#include
#include
#define buflen 256
char outbuf[buflen];
char inbuf[buflen] = "characters convertion";
int main()
retsize = iconv(cd, &pin, (size_t *)&inlen, &pout, (size_t *)&outlen);
if((size_t)-1 == retsize)
if(outlen > 0)
iconv_close(cd);
return 0;
}
linux和windows的區別
linux和windows的區別 linux windows linux介面 windows 介面 圖形介面風格根據發布版不同而不同,可能互不相容。gun linux的終端機是從unix傳承下來的,基本命令和操作方法也幾乎一樣 介面統一外殼程式固定程式選單幾乎一致,快捷鍵也幾乎相同 linux操作 ...
linux和windows的區別
1.什麼是linux?linux是一套免費使用和自由傳播的類unix作業系統,是乙個多使用者 多工 支援多執行緒和多cpu的作業系統。它能執行主要的unix工具軟體 應用程式和網路協議。它支援32位和64位硬體。linux繼承了unix以網路為核心的設計思想,是乙個效能穩定的多使用者網路作業系統。2...
linux和windows的區別
目前國內linux更多的是應用於伺服器上,而桌面作業系統更多使用的是 windows。主要區別如下 比較windows linux 介面介面統一,外殼程式固定所有windows程式選單幾乎一致,快捷鍵也幾乎相同 圖形介面風格依發布版不同而不同,可能互不相容。gnu linux的終端機是從unix傳承...