《UTF-8与GB2312之间的互换》的改进

下载源代码

  最近,在做一个小程序的时候,突然遇到了汉字编码转换问题。关于如何在UTF-8与GB2312之间转换的问题。在VC知识库里看到吴康彬的文章《UTF-8与GB2312之间的互换》,文章浅显易懂,代码也不长。省了我不少的找资料的时间。在此谢谢了。 :)
  在看代码的过程中,吴康彬用了许多字符串的转换,来进行2进制的运算,这就涉及到大量的IO操作,效率肯定比较低。而且编码转换的工作量往往非常大,因此效率问题很重要。而且,代码里,有许多,内存泄漏问题,可能是作者过于重视实现,没有注意这些细节问题。
  闲话少说,开始正题。在UTF-8,与UNICODE之间转换的时候,用二进制运算,代替了字符串的转换。UTF-8一个汉字,用3个字节,而UNICODE用2个字节;对应关系如下:

UTF-8编码:         [1,1,1,0,A5,A6,A7,A8],    [1,0,B3,B4,B5,B6,B7,B8],            [1,0,C3,C4,C5,C6,C7,C8];

对应的UNICODE编码:

[A5,A6,A7,A8,B3,B4,B5,B6],         [B7,B8,C3,C4,C5,C6,C7,C8]

因此我们只需进行位操作,即可达到目的;如:

      // 把UTF-8转换成Unicodevoid CChineseCodeLib::UTF_8ToUnicode(WCHAR* pOut,char *pText){char* uchar = (char *)pOut;uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);return;}
     // Unicode 转换成UTF-8 void CChineseCodeLib::UnicodeToUTF_8(char* pOut,WCHAR* pText){// 注意 WCHAR高低字的顺序,低字节在前,高字节在后char* pchar = (char *)pText;pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);pOut[2] = (0x80 | (pchar[0] & 0x3F));return;}
     // 把Unicode 转换成 GB2312 void CChineseCodeLib::UnicodeToGB2312(char* pOut,unsigned short uData){WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(WCHAR),NULL,NULL);return;}     
     // GB2312 转换成 Unicodevoid CChineseCodeLib::Gb2312ToUnicode(WCHAR* pOut,char *gbBuffer){::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);return;}
     //GB2312 转为 UTF-8void CChineseCodeLib::GB2312ToUTF_8(string& pOut,char *pText, int pLen){char buf[4];char* rst = new char[pLen + (pLen >> 2) + 2];memset(buf,0,4);memset(rst,0,pLen + (pLen >> 2) + 2);int i = 0;int j = 0;      while(i < pLen){//如果是英文直接复制就可以if( *(pText + i) >= 0){rst[j++] = pText[i++];}else{WCHAR pbuffer;Gb2312ToUnicode(&pbuffer,pText+i);UnicodeToUTF_8(buf,&pbuffer);unsigned short int tmp = 0;tmp = rst[j] = buf[0];tmp = rst[j+1] = buf[1];tmp = rst[j+2] = buf[2];j += 3;i += 2;}}rst[j] = ''\0'';//返回结果pOut = rst;             delete []rst;   return;}
     //UTF-8 转为 GB2312void CChineseCodeLib::UTF_8ToGB2312(string &pOut, char *pText, int pLen){char * newBuf = new char[pLen];char Ctemp[4];memset(Ctemp,0,4);int i =0;int j = 0;while(i < pLen){if(pText[i] > 0){newBuf[j++] = pText[i++];                       }else                 {WCHAR Wtemp;UTF_8ToUnicode(&Wtemp,pText + i);UnicodeToGB2312(Ctemp,Wtemp);newBuf[j] = Ctemp[0];newBuf[j + 1] = Ctemp[1];i += 3;    j += 2;   }}newBuf[j] = ''\0'';pOut = newBuf;delete []newBuf;return; }

  代码在WIN2K,VC++60 下编译,测试通过. 就说这么多吧,具体的大家看代码吧。草草的写的,大家莫笑,欢迎大家一起讨论; 觉觉罗。。。。

《UTF-8与GB2312之间的互换》的改进相关推荐

  1. UTF-8与GB2312之间的互换

    UTF-8与GB2312之间的互换 相信一定有不少的程序开发人员时常会遇到字符编码的问题,而这个问题也是非常让人头痛的.因为这些都是潜在的错误,要找出这些错误也得要有这方面的开发经验才行.特别是在处理 ...

  2. Java黑皮书课后题第5章:5.6(英里与千米之间的互换)编写一个程序,并排显示下面两个表格

    5.6(英里与千米之间的互换)编写一个程序,并排显示下面两个表格 题目 题目概述 破题 代码 题目 题目概述 5.6(英里与千米之间的互换)编写一个程序,并排显示下面两个表格 英里 千米 千米 英里 ...

  3. Java黑皮书课后题第5章:5.5(千克与磅之间的互换)编写一个程序,并排显示下面两个表格

    5.5(千克与磅之间的互换)编写一个程序,并排显示下面两个表格 题目 题目概述 破题 代码 题目 题目概述 5.5(千克与磅之间的互换)编写一个程序,并排显示下面两个表格 千克 磅 磅 千克 1 2. ...

  4. jQuery实现两个列表框的值之间的互换:

    jQuery实现两个列表框的值之间的互换: 截图如下: 代码如下: <%@ page language="java" import="java.util.*&quo ...

  5. 第五章第六题(英里与千米之间的互换)(Conversion from mile to kilometer and kilometer to mile)

    5.6(英里与千米之间的互换)编写一个程序,并排显示下列两个表格. 英里 千米 千米 英里 1 1.609 20 12.430 2 3.218 25 15.538 -- -- -- -- 9 14.4 ...

  6. [转]UTF-8 GBK UTF8 GB2312 之间的区别和关系

    from http://www.cnblogs.com/xiaomia/archive/2010/11/28/1890072.html UTF-8:Unicode TransformationForm ...

  7. 科普:UTF-8 GBK UTF8 GB2312 之间的区别和关系

    UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM.是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三 ...

  8. UTF-8 GBK GB2312 之间的区别和关系

    UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM.是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三 ...

  9. UTF-8 GBK UTF8 GB2312 之间的区别和关系

    UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM.是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三 ...

最新文章

  1. centos同网段双网关_学习笔记之初识网关
  2. 利用HttpRequester进行接口测试
  3. FreeRTOS知识点
  4. Linux系统安装及配置——Centos-7-X86_64-DVD-2009
  5. Mysql数据库,项目需求需要数据还原的数据表结构构思方案
  6. 有时间同情渣男傻女,不如想想人都是怎么被臆想出来的爱情给坑了
  7. Matlab实用代码——直方图的绘制并在单个直方图上标注对应数字
  8. python资料-大牛分享python资料
  9. crt计算机图形系统是什么东西,计算机图形系统功能.PPT
  10. 2021高考厦门科技中学成绩查询,2021年厦门重点高中名单及排名,厦门高中高考成绩排名榜...
  11. mysql 存储百分数_mysql中如何存储百分数
  12. 基于Java的微小企业人事管理系统的设计与实现 毕业设计-附源码231012
  13. ElasticSearch简单使用
  14. 彻底解决阿里云图床上传图片,图片不显示问题
  15. 在这个五月《安装Linux》简直易如反掌
  16. 十分钟设置android状态栏一体化开源工程推荐
  17. 10年观察1000家企业,我发现干大事的老板,都有4个特质
  18. 使用注解开发(重点)
  19. IT人人际交往篇—战胜害羞的心态
  20. DELL R440服务器安装Centos8.0

热门文章

  1. js练习8(幻灯片切换效果)
  2. Adobe Indesign怎么让图片衬于文字下方?
  3. Apple分区总体布局结构
  4. 自己构造公共程序(3)--DataGrid小方法
  5. cocos2dx视频教程进阶篇--第1天--吃西瓜游戏。
  6. Android TextView 显示HTML加图片
  7. CentOS7(64)环境使用rpm命令安装gcc
  8. 多线程设计模式 - Future模式
  9. Kylin 对维度表的的要求
  10. .Net Discovery 系列之三--深入理解.Net垃圾收集机制(上)