编码UTF8,UCS...

这篇博客探讨了UTF8和UCS的编码原理,包括UTF8如何根据字符位数使用不同数量的字节来表示。作者分享了学习资源,并提到了自己编写的UCS与UTF8相互转换的代码实现,同时提及了与其他编码如codepage转换的相关内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近学习了下编码

以下地址可以很好的学习到相关的知识

http://dev.youkuaiyun.com/develop/article/69/69883.shtm

http://dev.youkuaiyun.com/develop/article/72/72888.shtm

其中讲了UTF8的编码

当要表示的内容是 7位 的时候就用一个字节:0*******  第一个0为标志位,剩下的空间正好可以表示ASCII 0-127 的内容。
  当要表示的内容在 8 到 11 位的时候就用两个字节:110***** 10******  第一个字节的110和第二个字节的10为标志位。
  当要表示的内容在 12 到 16 位的时候就用三个字节:1110***** 10****** 10******    和上面一样,第一个字节的1110和第二、三个字节的10都是标志位,剩下的空间正好可以表示汉字。
  以此类推:
四个字节:11110**** 10****** 10****** 10******
  五个字节:111110*** 10****** 10****** 10****** 10******
  六个字节:1111110** 10****** 10****** 10****** 10****** 10******
  .............................................

我自己写了转换的代码如下

UCS和UTF8相互转换

int UCS2UTF8(wchar_t* pUCS,unsigned char* pUTF8)
{
 int UCSlen = 0, UTF8len = 0, i;
 unsigned char* pTempUTF8 = NULL;
 UCSlen = wcslen(pUCS);

 if(pUCS == NULL || pUTF8 == NULL)
  return -1;
 
 pTempUTF8 = pUTF8;
 for(i = 0; i < UCSlen; i++)
 {
  if(pUCS[i] <= 0x007F)//1 byte 0xxxxxxx
  {
   *(pTempUTF8++) = LOBYTE(pUCS[i]);
   UTF8len++;
  }
  else if(pUCS[i] <=0x07FF)//2 bytes 110xxxxx 10xxxxxx
  {
   *(pTempUTF8++) = HIBYTE(pUCS[i] << 2) & 0x3F | 0xC0;
   *(pTempUTF8++) = LOBYTE(pUCS[i] & 0x3f) | 0x80;
   UTF8len += 2;
  }
  else//3 bytes 1110xxxx 10xxxxxx 10xxxxxx
  {
   *(pTempUTF8++) = HIBYTE(pUCS[i] >> 4) | 0xe0;
   *(pTempUTF8++) = HIBYTE(pUCS[i] << 2) & 0x3F | 0x80;
   *(pTempUTF8++) = LOBYTE(pUCS[i]) & 0x3F | 0x80;
   UTF8len += 3;
  }
 }
 
 return UTF8len;
}
int UTF82UCS(unsigned char *pUTF8, wchar_t *pUCS)
{
 int UCSlen = 0, i;
 unsigned char *pTempUCS = NULL;
 unsigned char *pTempUTF8 = NULL;

 if(pUCS == NULL || pUTF8 == NULL)
  return -1;
 UCSlen = MultiByteToWideChar(CP_UTF8,0,pUTF8,-1,NULL,0);
 UCSlen--;
 pTempUCS = (char*)pUCS;
 pTempUTF8 = pUTF8;
 for(i = 0; i < UCSlen; i++)
 {
  if((*pTempUTF8) <= 0x7F)  //1 byte
  {
   *(pTempUCS + 1) = 0x00;
   *pTempUCS = *(pTempUTF8++);
   pTempUCS += 2;
  }
  else if((*pTempUTF8) >= 0xC0 && (*pTempUTF8) <= 0xDF)//2 bytes
  {
   *(pTempUCS + 1) = ((*pTempUTF8) >> 2) & 0x07;
   *pTempUCS = ((*pTempUTF8) << 6) | (*(pTempUTF8 + 1) & 0x3F);
   pTempUTF8 += 2;
   pTempUCS += 2;
  }
  else//3 bytes
  {
   *(pTempUCS + 1) = ((*pTempUTF8) << 4) | ((*(pTempUTF8 + 1) >> 2) & 0x0F);
   pTempUTF8++;
   *pTempUCS = ((*pTempUTF8) << 6) | (*(pTempUTF8+1) & 0x3F);
   pTempUTF8 += 2;
   pTempUCS += 2;
  }
 }
 return UCSlen;
}

其他编码和UCS转换

int ToUCS(unsigned char *p,wchar_t* pUCS,int codepage)
{
 int len = 0;

 if(pUCS == NULL || p == NULL)
  return -1;
 len = MultiByteToWideChar(codepage,0,p,-1,NULL,0);
 MultiByteToWideChar(codepage,0,p,-1,pUCS,len);
 return len;
}

int UCSTo(wchar_t* pUCS,char *p,int codepage)
{
 int len = 0;
 
 if(pUCS == NULL || pBIG5 == NULL)
  return -1;

 len = WideCharToMultiByte(codepage,0,pUCS,-1,NULL,0,NULL,NULL);
 WideCharToMultiByte(codepage,0,pUCS,-1,p,len,NULL,NULL);
 len--;
 return len;
}

这里的codepage在MSDN定义如下

BitCode pageDescription
ANSI
01252Latin 1
11250Latin 2: Eastern Europe
21251Cyrillic
31253Greek
41254Turkish
51255Hebrew
61256Arabic
71257Baltic
81258VietNam
9 - 15Reserved for ANSI
ANSI and
OEM
16874Thai
17932Japanese, Shift-JIS
18936Chinese: Simplified chars—PRC and Singapore
19949Korean Unified Hangeul Code (Hangeul TongHabHyung Code)
20950Chinese: Traditional chars—Hong Kong SAR, PRC and Taiwan
211361Korean (Johab)
22 - 29Reserved for alternate ANSI and OEM
30 - 31Reserved by system.
OEM
32 - 46Reserved for OEM
471258VietNam
48869IBM Greek
49866MS-DOS Russian
50865MS-DOS Nordic
51864Arabic
52863MS-DOS Canadian French
53862Hebrew
54861MS-DOS Icelandic
55860MS-DOS Portuguese
56857IBM Turkish
57855IBM Cyrillic; primarily Russian
58852Latin 2
59775Baltic
60737Greek; former 437 G
61708Arabic; ASMO 708
62850Western European/Latin 1
63437US

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值