《UTF-8与GB2312之间的互换》的改进
《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之间的互换》的改进相关推荐
- UTF-8与GB2312之间的互换
UTF-8与GB2312之间的互换 相信一定有不少的程序开发人员时常会遇到字符编码的问题,而这个问题也是非常让人头痛的.因为这些都是潜在的错误,要找出这些错误也得要有这方面的开发经验才行.特别是在处理 ...
- Java黑皮书课后题第5章:5.6(英里与千米之间的互换)编写一个程序,并排显示下面两个表格
5.6(英里与千米之间的互换)编写一个程序,并排显示下面两个表格 题目 题目概述 破题 代码 题目 题目概述 5.6(英里与千米之间的互换)编写一个程序,并排显示下面两个表格 英里 千米 千米 英里 ...
- Java黑皮书课后题第5章:5.5(千克与磅之间的互换)编写一个程序,并排显示下面两个表格
5.5(千克与磅之间的互换)编写一个程序,并排显示下面两个表格 题目 题目概述 破题 代码 题目 题目概述 5.5(千克与磅之间的互换)编写一个程序,并排显示下面两个表格 千克 磅 磅 千克 1 2. ...
- jQuery实现两个列表框的值之间的互换:
jQuery实现两个列表框的值之间的互换: 截图如下: 代码如下: <%@ page language="java" import="java.util.*&quo ...
- 第五章第六题(英里与千米之间的互换)(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 ...
- [转]UTF-8 GBK UTF8 GB2312 之间的区别和关系
from http://www.cnblogs.com/xiaomia/archive/2010/11/28/1890072.html UTF-8:Unicode TransformationForm ...
- 科普:UTF-8 GBK UTF8 GB2312 之间的区别和关系
UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM.是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三 ...
- UTF-8 GBK GB2312 之间的区别和关系
UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM.是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三 ...
- UTF-8 GBK UTF8 GB2312 之间的区别和关系
UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM.是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三 ...
最新文章
- centos同网段双网关_学习笔记之初识网关
- 利用HttpRequester进行接口测试
- FreeRTOS知识点
- Linux系统安装及配置——Centos-7-X86_64-DVD-2009
- Mysql数据库,项目需求需要数据还原的数据表结构构思方案
- 有时间同情渣男傻女,不如想想人都是怎么被臆想出来的爱情给坑了
- Matlab实用代码——直方图的绘制并在单个直方图上标注对应数字
- python资料-大牛分享python资料
- crt计算机图形系统是什么东西,计算机图形系统功能.PPT
- 2021高考厦门科技中学成绩查询,2021年厦门重点高中名单及排名,厦门高中高考成绩排名榜...
- mysql 存储百分数_mysql中如何存储百分数
- 基于Java的微小企业人事管理系统的设计与实现 毕业设计-附源码231012
- ElasticSearch简单使用
- 彻底解决阿里云图床上传图片,图片不显示问题
- 在这个五月《安装Linux》简直易如反掌
- 十分钟设置android状态栏一体化开源工程推荐
- 10年观察1000家企业,我发现干大事的老板,都有4个特质
- 使用注解开发(重点)
- IT人人际交往篇—战胜害羞的心态
- DELL R440服务器安装Centos8.0