UTF-8怎么解码?

hamham 2003-10-17 04:33:50
0xE4 0xBD 0xA0 0xE5 0xA5 0xBD 0x61 0x62 0x63 <--- UTF-8

解出来应该是 "你好abc"
怎么解码?

用MultiByteToWideChar的请不要回复
...全文
298 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluebohe 2003-11-01
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2366/2366911.xml?temp=.2917139
倒分贴,删除主要得分回复:记录如下

回复人: Darlinton(帅哥缺颗牙) ( ) 信誉:100 2003-10-17 16:53:30 得分:95



不进来看下,我们走着瞧:http://expert.csdn.net/Expert/topic/2358/2358992.xml?temp=.7887079



会思考的草 2003-10-17
  • 打赏
  • 举报
回复
源代码

以下是一段UCS4和UTF8互换的源代码(在Turbo C++ 3.0 及 GCC 3.2编译通过):

//UCS4 <--> UTF8
//=====================
//Written by Chio Chan Fong (http://chiosoft.51.net, chiosoft@163.net)
//21 March 2003

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

//define a UCS-4 type
typedef long wchar_t_ccf;

unsigned char* ucs_to_utf8( wchar_t_ccf x )
{
unsigned char *pt = NULL;

if( x>=0 && x<=0x7f ) {
pt = malloc( 1+1 );
pt[0] = x;
pt[1] = 0;
}

if( x>=0x80 && x<=0x7ff ) {
pt = malloc( 2+1 );
pt[0] = 0xc0 + x/64;
pt[1] = 0x80 + x%64;
pt[2] = 0;
}

if( x>=0x800 && x<=0xffff ) {
pt = malloc( 3+1 );
pt[0] = 0xe0 + x/4096;
pt[1] = 0x80 + (x/64)%64;
pt[2] = 0x80 + x%64;
pt[3] = 0;
}

return pt;
}

wchar_t_ccf utf8_to_ucs( unsigned char *z )
{
wchar_t_ccf w = -1;

if( *z <= 0x7f )
w = *z;
else
if( (*z&0xf0) == 0xc0 ) { //two bytes(1100 xxxx)
w = ((*z++)-0xc0)*64L;
w += (*z)-0x80;
}
else
if( (*z&0xf0) == 0xe0 ) { //three bytes(1110 xxxx)
w = ((*z++)-0xe0)*4096L;
w += ((*z++)-0x80)*64L;
w += (*z)-0x80;
}

return w;
}

int main(void)
{
unsigned char *p, *q;
wchar_t_ccf uni = 0x8d99;

p = ucs_to_utf8( uni );
if( p != NULL )
{
q = p; //save the pointer

printf( "%lx -> ", uni );
while( *p )
printf( "%x ", *p++ );
printf( "-> %lx\n", utf8_to_ucs( q ) );

free( q );
}

return 0;
}

会思考的草 2003-10-17
  • 打赏
  • 举报
回复
什么是UTF8?

  UTF8并不算是一种电脑编码,而是一种储存和传送的格式,如前所述,每个Unicode/UCS字符都以 2或4个bytes来储存,看看以下的比较:

  以"I am Chinese"为例
   用ANSI储存:12 Bytes
   用Unicode/UCS2储存:24 Bytes + 2 Bytes(header)
   用UCS4储存:48 Bytes + 4 Bytes(header)

  以"我是中国人"为例
   用ANSI储存:10 Bytes
   用Unicode/UCS2储存:10 Bytes + 2 Bytes(header)
   用UCS4储存:20 Bytes + 4 Bytes(header)

  由此可见直接以Unicode/UCS的原始形式来储存是一种极大的浪费,而且也不利于互联网的传输(中文稍为合算一点^_^)。

  有见及此,Unicode/UCS的压缩形式--UTF8出现了,套用官方网站的首句话『UTF-8 stands for Unicode Transformation Format-8. It is an octet (8-bit) lossless encoding of Unicode characters.』,由于UTF也适用于编码UCS,故亦可称为『UCS transformation formats (UTF)』

  UTF8是以8bits即1Bytes为编码的最基本单位,当然也可以有基于16bits和32bits的形式,分别称为UTF16和UTF32,但目前用得不多,而UTF8则被广泛应用在文件储存和网络传输中。
编码原理

先看这个模板:

UCS-4 range (hex.) UTF-8 octet sequence (binary)
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx

0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx

编码步骤:
1) 首先确定需要多少个8bits(octets)
2) 按照上述模板填充每个octets的高位bits
3) 把字符的bits填充至x中,字符顺序:低位→高位,UTF8顺序:最后一个octet的最末位x→第一个octet最高位x
4) 解码的原理一样。

实例:(留意每个bit的颜色,粗体字为模板内容)

UCS-4 |UTF-8
-----------------------------------------------------------------------------
HEX BIN Bytes| BIN HEX Bytes
0000 000A 00001010 4 | 00001010 0A 1
0000 0099 10011001 4 | 11000010 10011001 C2 99 2
0000 8D99 10001101 10011001 4 | 11101000 10110110 10011001 E8 B6 99 3



  不知大家看懂了没有,其实不懂也无所谓,反正又不用自己算,程式可以完全代劳。

  以UTF8格式储存的文件档首标识为EF BB BF。
效率

  从上述编码原理中得出的结论是:
   1.每个英文字母、数字所占的空间为1 Byte;
   2.泛欧语系、斯拉夫语字母占2 Bytes;
   3.汉字占3 Bytes。

  由此可见UTF8对英文来说是个非常诱人的方案,但对中文来说则不太合算,无论用ANSI还是 Unicode/UCS2来编码都只用2 Bytes,但用UTF8则需要3 Bytes。

  以下是一些统计资料,显示用UTF8来储存文件每个字符所需的平均字节:
   1.拉丁语系平均用1.1 Bytes;
   2.希腊文、俄文、阿拉伯文和希伯莱文平均用1.7 Bytes;
   3.其他大部份文字如中文、日文、韩文、Hindi(北印度语)用约3 Bytes;
   4.用超过4 Bytes的都是些非常少用的文字符号。

官方网站:http://www.utf8.com/
wuxfBrave 2003-10-17
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2187/2187085.xml?temp=.8160364
阿甘 2003-10-17
  • 打赏
  • 举报
回复
看这个

http://expert.csdn.net/Expert/topic/2187/2187085.xml?temp=.8160364
FlyYang 2003-10-17
  • 打赏
  • 举报
回复
up

---------
++C++
---------

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧