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 分别代表小端和大端模式。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值