字符集编码---2 编码转换

    本篇将划分为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 Code Page

Windows API: MultiByteToWideChar

Windows API: WideCharToMultiByte

Linux API: iconv_open

Linux API: iconv

Linux API: iconv_close

   

posted @ 2018-08-01 00:42  !--!  阅读(333)  评论(0编辑  收藏  举报