wchar_t 、UTF-8、UTF-16的转换方法

继续编码转换

 

      Unicode 有两套编码集,UCS-2 和 UCS-4。Windows 的内部其实是用的 UCS-2 标准,并用 UTF-16 来实现。而非 Windows 系统大多采用了 UTF-8 实现。

      大家都知道在windows上wchar_t是2个字节表示,而在Linux上wchar_t是4个字节表示的。这样写跨平台的程序时,就会不统一。

下面是我用到的几个函数,wchar_t与UTF-8编码之间的转换和UTF-16和wchar_t之间的转换。

 

#ifdef WINDOWS #include <windows.h> #include <stdio.h> #include <ctype.h> #else #include <iconv.h> #include <wctype.h> #include <wchar.h> #include <errno.h> #endif //wchar_t转成UTF-8 int FW2UTF8Convert( const wchar_t* a_szSrc, int a_nSrcSize, char* a_szDest, int a_nDestSize ) { #ifdef WINDOWS return WideCharToMultiByte( CP_UTF8, 0, a_szSrc, -1, a_szDest, a_nDestSize, NULL, NULL ); #else size_t result; iconv_t env; env = iconv_open("UTF-8","WCHAR_T"); if (env==(iconv_t)-1) { printf("iconv_open WCHAR_T->UTF8 error%s %d/n",strerror(errno),errno) ; return -1; } result = iconv(env,(char**)&a_szSrc,(size_t*)&a_nSrcSize,(char**)&a_szDest,(size_t*)&a_nDestSize); if (result==(size_t)-1) { printf("iconv WCHAR_T->UTF8 error %d/n",errno) ; return -1; } iconv_close(env); return (int)result; #endif } //UTF-8转成wchar_t int FUTF82WConvert( const char* a_szSrc, wchar_t* a_szDest, int a_nDestSize ) { #ifdef WINDOWS return MultiByteToWideChar( CP_UTF8, 0, a_szSrc, -1, a_szDest, a_nDestSize ); #else size_t result; iconv_t env; int size = strlen(a_szSrc)+1 ; env = iconv_open("WCHAR_T","UTF-8"); if (env==(iconv_t)-1) { printf("iconv_open UTF8->WCHAR_T error %d/n",errno) ; return -1; } result = iconv(env,(char**)&a_szSrc,(size_t*)&size,(char**)&a_szDest,(size_t*)&a_nDestSize); if (result==(size_t)-1) { printf("iconv UTF8->WCHAR_T error %d/n",errno) ; return -1; } iconv_close(env); return (int)result; #endif } //wchar_t转成utf16 int FW2UConvert( const wchar_t* a_szSrc, int a_nSize,char* a_szDest, int a_nDestSize ) { #ifdef WINDOWS memcpy_s((wchar_t*)a_szDest,a_nDestSize,a_szSrc,a_nSize); return a_nSize ; #else size_t result; iconv_t env; env = iconv_open("UCS-2-INTERNAL","UCS-4-INTERNAL"); if (env==(iconv_t)-1) { printf("iconv_open WCHAR_T->UTF16 error%s %d/n", strerror(errno),errno); return -1; } result = iconv(env,(char**)&a_szSrc,(size_t*)&a_nSize,(char**)&a_szDest,(size_t*)&a_nDestSize); if (result==(size_t)-1) { printf("iconv WCHAR_T->UTF16 error %s %d/n", strerror(errno), errno); return -1; } iconv_close(env); return (int)result; #endif } //utf16转成wchar_t int FU2WConvert( const char* a_szSrc, int a_nSize, wchar_t* a_szDest, int a_nDestSize ) { #ifdef WINDOWS memcpy_s(a_szDest,a_nDestSize,(const wchar_t*)a_szSrc,a_nSize); return a_nSize ; #else size_t result; iconv_t env; env = iconv_open("UCS-4-INTERNAL","UCS-2-INTERNAL"); if (env==(iconv_t)-1) { printf("iconv_open error %d/n",errno) ; return -1; } result = iconv(env,(char**)&a_szSrc,(size_t*)&a_nSize,(char**)&a_szDest,(size_t*)&a_nDestSize); if (result==(size_t)-1) { printf("UTF16 -> WCHAR_T conv error %d/n",errno) ; return -1; } iconv_close(env); return (int)result; #endif }   

 

ps:在Linux上我用的是iconv库.其中wchar_t一般以UCS-4标准。

     UCS-4-INTERNAL ,UCS-2-INTERNAL  会根据本机的存储方式(大端、小端)进行处理。

     还有UCS-2LE和UCS-2BE 分别代表小端和大端模式。

你可能感兴趣的:(windows,linux,null,存储,跨平台)