如何将UNICODE码转换为UTF8字符?

yoogle 2009-06-29 02:54:31
比如我输入548E,这个是一个汉字的UNICODE码,我想得到这个汉子的UTF8码,如何得到?
...全文
263 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
smartdog2008 2010-07-09
  • 打赏
  • 举报
回复
xie xie
zhouzheng1982 2009-06-29
  • 打赏
  • 举报
回复
utf8规则:

0xxxxxxx (00-7f) 7bit
110yyyyx 10xxxxxx (c0-df)(80-bf) 11bit
1110yyyy 10yxxxxx 10xxxxxx (e0-ef)(80-bf)(80-bf) 16bit
11110yyy 10yyxxxx 10xxxxxx 10xxxxxx (f0-f7)(80-bf)(80-bf)(80-bf) 21bit
111110yy 10yyyxxx 10xxxxxx 10xxxxxx 10xxxxxx (f8-fb)(80-bf)(80-bf)(80-bf)(80-bf) 26bit
1111110y 10yyyyxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx (fc-fd)(80-bf)(80-bf)(80-bf)(80-bf)(80-bf) 31bit
用户 昵称 2009-06-29
  • 打赏
  • 举报
回复
utf8与unicode是对应的,utf8通过移位就能获得unicode,反之也可以。简单来说,使用WideCharToMultiByte。
zhouzheng1982 2009-06-29
  • 打赏
  • 举报
回复
utf16: 548E -> 1000111001010100
utf8: 11101000 10111001 10010100 -> E8B994
ok1234567 2009-06-29
  • 打赏
  • 举报
回复
WORD w=0x548E;
char sz[4]={0};
char *d=sz;
//下面的代码将一个汉字的UNICODE码转换为3字节的utf-8


*d = HIBYTE(w);
*d >>= 4;
*d |= 0xE0;

d++;
*d = HIBYTE(w);
*d <<= 4;
*d >>= 2;
*d |= (LOBYTE(w)>>6);
*d |= 0x80;

d++;
*d = (LOBYTE(w)<<2);
*d >>= 2;
*d |= 0x80;
AllenTing 2009-06-29
  • 打赏
  • 举报
回复
详细解释可以见这:
http://baike.baidu.com/view/40801.htm
AllenTing 2009-06-29
  • 打赏
  • 举报
回复

LZ只要根据Unicode和UTF8之间转换关系就可以知道了,比如:

  Unicode编码(16进制) ║ UTF-8 字节流(二进制)
000000 - 00007F ║ 0xxxxxxx
000080 - 0007FF ║ 110xxxxx 10xxxxxx
000800 - 00FFFF ║ 1110xxxx 10xxxxxx 10xxxxxx
010000 - 10FFFF ║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx


BOOL UnicodeToUTF8(DWORD dwSrc, DWORD& dwDest)
{
if(dwSrc <= 0x000007F)
{
dwDest = dwSrc;
}else if(dwSrc >= 0x000080 && dwSrc <=0x0007FF)
{
BYTE byFirst = 0;
BYTE bySecond = 0;
byFirst = (3<<6) + (dwSrc>>6&0x1F);
bySecond = (1<<7) + (dwSrc&0x3F);
dwDest = (byFirst<<8) + bySecond;
}else if(dwSrc >= 0x000800 && dwSrc <= 0x00FFFF)
{
BYTE byFirst = 0;
BYTE bySecond = 0;
BYTE byThird = 0;
byFirst = (14<<4) + (dwSrc>>12&0xF);
bySecond = (2<<6) + (dwSrc>>6&0x3F);
byThird = (2<<6) + (dwSrc&0x3F);
dwDest = (byFirst<<16) + (bySecond<<8) + byThird;
}else if(dwSrc >= 0x010000 && dwSrc <= 0x10FFFF)
{
BYTE byFirst = 0;
BYTE bySecond = 0;
BYTE byThird = 0;
BYTE byFouth = 0;
byFirst = (30<<3) + (dwSrc>>18);
bySecond = (2<<6) + (dwSrc>>12&0x3F);
byThird = (2<<6) + (dwSrc>>6&0x3F);
byFouth = (2<<6) + (dwSrc&0x3F);
dwDest = (byFirst<<24) + (bySecond<<16) + (byThird<<8) + byFouth;
}else
return FALSE;
return TRUE;
}
yoogle 2009-06-29
  • 打赏
  • 举报
回复
我说的不是字符串,是将unicode值转换成utf8码。
华亭真人 2009-06-29
  • 打赏
  • 举报
回复

int len=str.GetLength();
int unicodeLen=MultiByteToWideChar(CP_UTF8,0,str,-1,NULL,0);
wchar_t * pUnicode;
pUnicode=new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
MultiByteToWideChar(CP_UTF8,0,str,-1,(LPWSTR)pUnicode,unicodeLen);
BYTE * pTargetData=NULL;
int targetLen=WideCharToMultiByte(936,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,0,NULL,NULL);
pTargetData=new BYTE[targetLen+1];
memset(pTargetData,0,targetLen+1);
WideCharToMultiByte(936,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,targetLen,NULL,NULL);
CString rt;
rt.Format("%s",pTargetData);
delete pUnicode;
delete pTargetData;
return rt;
bragi523 2009-06-29
  • 打赏
  • 举报
回复
WideCharToMultiByte
oyljerry 2009-06-29
  • 打赏
  • 举报
回复
WideCharToMultiyBytes,然后MultiBytesToWideChar再设置字符集为UTF8

16,472

社区成员

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

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

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