unicode to utf8 转化

来源:互联网 发布:跑步机推荐 知乎 编辑:程序博客网 时间:2024/05/30 04:29

#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>

 

//计算需要的char的长度

int wstr2strLen(const wchar_t *pwstr)
{
     int count = 0;
     int i;
     int len = wcslen(pwstr);
     for(i = 0; i < len; ++i)
     {
          unsigned short tmp = *(pwstr + i);
          printf("tmp num is %0x/n", tmp);
          if (tmp < 0x007F)
          {
               count += 1;
          } else if (tmp > 0x0800)
          {
               count += 3;
           }
          else
          {
               count += 2;
          }
     }
     return count;
}

 

//单个字符的转化

/*    UCS-2编码(16进制) UTF-8 字节流(二进制)
        0000 - 007F 0xxxxxxx
        0080 - 07FF 110xxxxx 10xxxxxx
        0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

*/

int W2C(const wchar_t *pw, char *pc)
{
     unsigned short tmp = *pw;
     if (tmp < 0x007F)
     {
          *pc = *pw;
          return 1;
     } 
     else if (tmp > 0x0800)
     {
              *pc = 0xe0 | (((*pw >> 8) & 0xf0) >> 4);
              *(pc + 1) = 0x80 | (((*pw >> 8) & 0x0f) << 2) | ((*pw & 0xc0) >> 6);
              *(pc + 2) = 0x80 | ((*pw & 0x3f));
              return 3;
     }
     else
     {
              *pc = 0xc0 | ((*pw >> 8) & 0x03) << 2 | (*pw & 0xc0) >> 6;
              *(pc + 1) = 0x80 | (*pw & 0x3f);
              return 2;
     }
     return 0;
}

 

//字符串的转化

char *wstr2cstr(const wchar_t *pwstr, char *pcstr, size_t len)
{
     char *ptemp = pcstr;
     if (pwstr != NULL && pcstr != NULL)
     {
          size_t wstr_len = wcslen(pwstr);
          printf("wstr_len is %d/n", wstr_len);
          len = (len > wstr_len) ? wstr_len : len;
          while (len-- > 0 )
          {
               int i = W2C(pwstr, pcstr);
               pwstr++;
               pcstr += i;
          }
          *pcstr = '/0';
          return ptemp;
     }
     return 0;
}

原创粉丝点击