字符编码转化


ANSI C定义了统一的编码转化函数setlocale,mbstowcs,wcstombs,但这些函数在WIN32平台上实现了,却未在LINUX平台上实现,在linux平台上实现编码转化需要调用iconv_open, iconv, iconv_close函数.<br /><br />WIN32平台自己提供了两个编码码转化函数MultiByteToWideChar和<br /><br />WideCharToMultiByte。两个不同的编码页间的转化需要通过UnicodeLittle编码来中转<br />

bool GB2312_AnsiToUnicode(char *lpszOut, const char* lpszIn,
                          const char* lpszCurCode/* = NULL*/,
                          const char* lpszOutCode/* = NULL*/)
{
#ifdef WIN32       //  _WIN32
       //Do nothing

 int lpszOut_size=GB2312_AnsiToUnicode_Size(lpszIn);


    //这函数与操作系统相关,XP下用CP_THREAD_ACP,win2000下用CP_ACP
 MultiByteToWideChar(CP_THREAD_ACP, 0,lpszIn,strlen(lpszIn)+1,(unsigned short*)lpszOut,lpszOut_size);
   

#else               //  _WIN32
#ifdef HAVE_ICONV
    /* Use iconv to convert the message into utf-16.
    * "char" and "" are aliases for the local 8-bit encoding */
    iconv_t cd;
    //  ICONV_CONST char *from_str = message;
    char *from_str = (char*)lpszIn;
    char *to_str = lpszOut;
    size_t from_sz = strlen(lpszIn) + 1;
    //      size_t to_sz = from_sz*4;
    size_t to_sz = GB2312_AnsiToUnicode_Size(lpszIn);
    size_t res;
    int i;
 char lpszCodeName_From[30], lpszCodeName_To[30];
 if (lpszCurCode)
  strcpy(lpszCodeName_From, lpszCurCode);
 else
  strcpy(lpszCodeName_From, "gb2312");
 if (lpszOutCode)
  strcpy(lpszCodeName_To, lpszOutCode);
 else
  strcpy(lpszCodeName_To, "UTF-16");
#ifdef _DEBUG
 fprintf(stdout, "Convert '%s' from %s to %s/n", lpszIn, lpszCodeName_From, lpszCodeName_To);
#endif
    //  if ((cd = iconv_open("unicode", "gb2312")) == (iconv_t)-1) {
    if ((cd = iconv_open(lpszCodeName_To, lpszCodeName_From)) == (iconv_t)-1) {
        perror("Couldn't open iconv");
        return false;
     }
     res = iconv(cd, &from_str, &from_sz, &to_str, &to_sz);
     if (res == -1) {
  perror("Couldn't use iconv");
  return false;
     }
     iconv_close(cd);

#endif
#ifdef _DEBUG
 fprintf(stdout, "Convert result: '%s'/n", lpszOut);
#endif
#endif      //  End of _WIN32

 return true;
}

int GB2312_AnsiToUnicode_Size(const char* lpszIn)
{
    int iCounter = 0;
 for (int index = 0; lpszIn[index]; index++) {
  if( (unsigned char)lpszIn[index] > 127 )
  {
   index++;
  }
  else
  {
            ;
  }
  iCounter+=2;
 }
    iCounter += 4;
#ifdef _DEBUG
    fprintf(stdout, "GB2312_AnsiToUnicode_Size() return %d/n", iCounter);
#endif
    return iCounter;
    //  return 48;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值