ASCII码、Unicode和UTF-8之间的转换

ASCII码:是指单字节字符集;

Unicode:本文特指按Big Endian存储的字符集;

UTF-8:一种变长的编码字符集。它可以使用1~6个字节表示一个符号, 根据不同的符号而变化字节长度。

UTF-8的编码规则如下:

1) 对于单字节的符号, 字节的第一位设为0, 后面7位为这个符号的unicode码. 因此对于英语字母, UTF-8编码和ASCII码是相同的。

2) 对于n字节的符号(n>1), 第一个字节的前n位都设为1, 第n+1位设为0, 后面字节的前两位一律设为10. 剩下的没有提及的二进制位, 全部为这个符号的unicode码。

下表总结了编码规则, 字母x表示可用编码的位

    |  Unicode符号范围      |  UTF-8编码方式
 n |  (十六进制)                     | (二进制)
---+-----------------------+------------------------------------------------------
 1 | 0000 0000 - 0000 007F |                                                                                      0xxxxxxx
 2 | 0000 0080 - 0000 07FF |                                                                     110xxxxx 10xxxxxx
 3 | 0000 0800 - 0000 FFFF |                                                    1110xxxx 10xxxxxx 10xxxxxx
 4 | 0001 0000 - 0010 FFFF |                                   11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
 5 | 0020 0000 - 03FF FFFF |                  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
 6 | 0400 0000 - 7FFF FFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx


1. ASCII与UTF-8之间的转换

// ASCII字符串转UTF_8
/*****************************************************************************
 * 将ASCII数据转换成的UTF8编码字节流.
 *
 * 参数:
 *    pAscii      指向输入ASCII缓冲区
 *    pDes        指向输出缓冲区, 其保存的数据即是UTF-8编码值,
 *
 * 返回值:
 *    成功则返回该字符的UTF8编码所占用的字节数; 失败则返回0.
 *
 * 注意:
 *     请保证 pOutput 缓冲区有最少有 6 倍Unicode缓冲 字节的空间大小!
 ****************************************************************************/
int AsciiToUTF8(unsigned char* pAscii, unsigned char* pDes)
{
    int     nIndex          = 0;
    int     nCount          = 0;
    unsigned char* pSource  = pAscii;
    unsigned char*   p      = pDes;
    unsigned char  szTemp[10];
    unsigned long w        = 0;
    while(*pSource != 0x00)
    {
        if((*pSource) < 0x7F)
        {
            if(p)  
            {
                *p      = *pSource;
                p++;
            }
            nCount++;
        }
        else
        {
            //w       = (*pSource<<8) | *(pSource+1);
            memcpy(szTemp, pSource, 2);
            szTemp[2]   = 0x00;
            ANSIToUnicode((char*)szTemp, (wchar_t*)&w);
            nIndex  = unicode_to_utf8_one((unsigned long)w, (unsigned char*)szTemp, 10);
            if(p)
            {
                memcpy(p, szTemp, nIndex);
                p       += nIndex;
            }
            nCount  += nIndex;
            pSource++;
        }
        pSource++;
    }
    if(p)*p              = 0x00;

    return nCount;
}

// UTF8字符串转ASCII字符
/*****************************************************************************
 * 将UTF8数据转换成的ASCII编码字节流.
 *
 * 参数:
 *    pUtf8         指向输入UTF_8缓冲区
 *    pDes          指向输出缓冲区, 其保存的数据即是ASCII编码值,
 *
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值