Unicode UTF-8 gb2312 字符集

此伟哥非彼伟哥 2015-12-05 10:51:03
为了大家的参考。当然了,最重要的是为了我以后自己用。
1) 发展史 :最早是ASSIC码,后来网络发展,别的国家也要用,但是ASSIC 已经不能不能满足全球的需要,于是陆续出现 utf-8 与 gb2312
等字符集,当然了这些都是各个地方自己定制的后来为了统一,又规定了Unicode 的编码。

2)占用字节: 最早ASSIC码 一个只占一个字符,utf-8 与 gb2312 是 中文占两个字符占一个。Unicode 的事所有的都占两个字符
理论上讲,你可以通过操作一个char 将他们的字符集随便转,只要你清楚转换规则。但一般应用中都不会自己这么做(有人已经写好函数了,为什么要自己做这费力的事情)。
有兴趣的可以 看 http://blog.csdn.net/chary8088/article/details/21226375

3) 转换函数: 这个函数也是我单试网上找到的,至于出处我忘点了,实在抱歉。
函数为自己写的 一个是字节转款字节,一个是宽字节转字节,在这个过程中就把字符集转换了,
虽然比较繁琐,但我现在还没有找到更好用的方法。

有更好的方法的朋友 希望可以告诉我
const CString MBToWC(UINT CodePoge,const std::string &str)
{
CString cstr;
int nwLen = MultiByteToWideChar(CodePoge,0,(LPSTR)str.c_str(),-1,NULL,0);
// TRACE( "UTF8 String len:%d\n ",nwLen);
LPWSTR lpw=new WCHAR[nwLen+1];
// TRACE( "sizeof(lpw):%d\n ",(nwLen+1)*sizeof(WCHAR));
memset (lpw,0,(nwLen+1)*sizeof(WCHAR));
// utf-8 to uniocde ,1 convert
MultiByteToWideChar( CodePoge, 0, (LPSTR)str.c_str(),
strlen(str.c_str()), (LPWSTR)lpw, nwLen );

cstr.Format(L"%s",lpw);
delete[] lpw;
return cstr;
}
const std::string WCToMB(UINT CodePoge,const CString &str)
{
char* pElementText;
std::string strText;
// wide char to multi char
int iTextLen = WideCharToMultiByte( CodePoge,0,(LPCWSTR)str,-1,NULL,0,NULL,NULL );
pElementText = new char[iTextLen + 1];
memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );

WideCharToMultiByte( CodePoge,0,(LPCWSTR)str,-1,pElementText,iTextLen,NULL,NULL );

strText = pElementText;
delete[] pElementText;
return strText;
}

UINT CodePoge 为字符编码

UTF-8 宏 为CP_UTF8
gb2312 我没发现宏 直接用数值 936

函数已有,更多详细信息 查看 MSDN。 只做参考。有错误希望指出

...全文
91 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-12-07
  • 打赏
  • 举报
回复
// UTF-8 编码字符理论上可以最多到 6个字节长,但目前全世界的所
// 有文字和符号种类加起来也只要编到 4个字节长就够了。
//   UTF-8 是以 8位(即 1个字节)为单元对原始码进行编码(注意一
// 点:这里所讲的原始码都是指Unicode码),并规定:多字节码(2个字
// 节以上才称为多字节)以转换后第1个字节起头的连续“1”的数目(这
// 些连续“1”称为标记位),表示转换成几个字节:“110”连续两个
// “1”,表示转换结果为2个字节,“1110”表示3个字节,而“11110”
// 则表示4个字节……跟随在标记位之后的“0”,其作用是分隔标记位和
// 字符码位。第2~第4个字节的起头两个位固定设置为“10”,也作为标
// 记,剩下的6个位才做为字符码位使用。
//   这样,2字节UTF-8码剩下11个字符码位,可用以转换0080~07FF的
// 原始字符码,3字节剩下16个字符码位,可用以转换0800~FFFF的原始字
// 符码,由此类推。编码方式的模板如下:
//
// 原始码(16进制) UTF-8编码(二进制)
// --------------------------------------------
// 0000 - 007F       0xxxxxxx
// 0080 - 07FF       110xxxxx 10xxxxxx
// 0800 - FFFF       1110xxxx 10xxxxxx 10xxxxxx
// ……
// --------------------------------------------
//
//   模板中的“x”表示字符码。
//   Ascii码<007F,编为1个
// 字节的UTF-8码。汉字的 Unicode编码范围为0800-FFFF,所以被编为
// 3个字节的UTF-8码。
//   例如“汉”字的Unicode编码是6C49,6C49在0800-FFFF之间,所以
// 要用3个字节的模板:1110wwww 10xxxxyy 10yyzzzz。

//    6    C    4    9
// 0110 1100 0100 1001
// wwww xxxx yyyy zzzz
//     wwww   xxxxyy   yyzzzz
// 1110wwww 10xxxxyy 10yyzzzz。
// 11100110 10110001 10001001
//    E   6    B   1    8   9
//“汉”字的UTF-8编码是E6 B1 89
fefe82 2015-12-05
  • 打赏
  • 举报
回复
utf8 中文是 3 个字节。 unicode 现在应该是可以到 0x1FFFFF 吧。utf16 用 2 个或 4 个字节(surrogate pairs) ,utf32 全是 4 个字节。 unicode 本身不是一种编码。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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