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编码值,
*