本篇将划分为Windows平台、Linux平台两个部分,分别介绍两个平台下经常使用的字符编码转换接口及思路。html
Windows平台:linux
WIndows平台提供了一对 其余编码 与 UTF-16间相互转换的API,所以Windows平台下的编解码转换均可以经过UTF-16编码做为桥梁。windows
头文件:stringapiset.h (include Windows.h)api
库文件:Kernel32.libide
转为UTF-16编码: int MultiByteToWideChar(函数
UINT CodePage,编码
DWORD dwFlags,spa
_In_NLS_string_(cbMultiByte)LPCCH lpMultiByteStr,code
int cbMultiByte,htm
LPWSTR lpWideCharStr,
int cchWideChar );
UTF-16编码转出:int WideCharToMultiByte(
UINT CodePage,
DWORD dwFlags,
_In_NLS_string_(cchWideChar)LPCWCH lpWideCharStr,
int cchWideChar,
LPSTR lpMultiByteStr,
int cbMultiByte,
LPCCH lpDefaultChar,
LPBOOL lpUsedDefaultChar );
这两个函数中,须要说明的就是第 1 个参数:CodePage。Windows系统是能够同时支持多种字符集的,微软为不一样的字符集都指定了一个惟一标识,并定义为CodePage。每一个CodePage都一个宏定义与其相对。经常使用CodePage宏定义有如下3个:
CP_ACP:本地字符编码,就是取当前系统默认的字符集,这个跟系统设置(当前系统默认的语言及所处时区)有关系。
因此不一样机器,甚至同一机器上,这个宏对应的实际字符集都是不固定的。
CP_UTF8:UTF-8编码。
CP_936:GBK编码。
Linux平台
Linux平台下,GCC 为咱们提供了一组名为 iconv的函数,可用于实现编码转换。
头文件:iconv.h
初始化,指定转入、转出编码格式:
iconv_t iconv_open(const char *tocode, const char *fromcode);
编码转换:
size_t iconv(iconv_t cd,
char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft);
结束:
int iconv_close(iconv_t cd);
须要说明的是 iconv_open的两个参数,这两个参数指明了转入及转出的编码字符集,具体取值,能够使用 iconv --list 命令来获取。
相关连接:
Windows API: MultiByteToWideChar