本篇将划分为Windows平台、Linux平台两个部分,分别介绍两个平台下常用的字符编码转换接口及思路。
Windows平台:
WIndows平台提供了一对 其他编码 与 UTF-16间相互转换的API,因此Windows平台下的编解码转换都可以通过UTF-16编码作为桥梁。
头文件:stringapiset.h (include Windows.h)
库文件:Kernel32.lib
转为UTF-16编码: int MultiByteToWideChar(
UINT CodePage,
DWORD dwFlags,
_In_NLS_string_(cbMultiByte)LPCCH lpMultiByteStr,
int cbMultiByte,
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
Windows API: WideCharToMultiByte