- 浏览: 14008 次
最新评论
类转自:http://www.cnblogs.com/xiaoka/articles/2585189.html
下面的代码实现了一个用于C++中转码的类strCoding。里面有UTF8、UNICODE、GB2312编码的互相转换。
结果:
http://blog.csdn.net/generalhking/article/details/8233824
下面的代码实现了一个用于C++中转码的类strCoding。里面有UTF8、UNICODE、GB2312编码的互相转换。
.H文件: [cpp] view plaincopyprint? #pragma once #include <iostream> #include <string> #include <windows.h> using namespace std; class strCoding { public: strCoding(void); ~strCoding(void); void UTF_8ToGB2312(string &pOut, char *pText, int pLen);//utf_8转为gb2312 void GB2312ToUTF_8(string& pOut,char *pText, int pLen); //gb2312 转utf_8 string UrlGB2312(char * str); //urlgb2312编码 string UrlUTF8(char * str); //urlutf8 编码 string UrlUTF8Decode(string str); //urlutf8解码 string UrlGB2312Decode(string str); //urlgb2312解码 private: void Gb2312ToUnicode(WCHAR* pOut,char *gbBuffer); void UTF_8ToUnicode(WCHAR* pOut,char *pText); void UnicodeToUTF_8(char* pOut,WCHAR* pText); void UnicodeToGB2312(char* pOut,WCHAR uData); char CharToInt(char ch); char StrToBin(char *str); }; .cpp文件: [cpp] view plaincopyprint? #include "StdAfx.h" #include "urlcodeing.h" //这是个类strCoding (strCoding.cpp文件) strCoding::strCoding(void) { } strCoding::~strCoding(void) { } void strCoding::Gb2312ToUnicode(WCHAR* pOut,char *gbBuffer) { ::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1); return; } void strCoding::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; } void strCoding::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; } void strCoding::UnicodeToGB2312(char* pOut,WCHAR uData) { WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(WCHAR),NULL,NULL); return; } //做为解Url使用 char strCoding:: CharToInt(char ch){ if(ch>='0' && ch<='9')return (char)(ch-'0'); if(ch>='a' && ch<='f')return (char)(ch-'a'+10); if(ch>='A' && ch<='F')return (char)(ch-'A'+10); return -1; } char strCoding::StrToBin(char *str){ char tempWord[2]; char chn; tempWord[0] = CharToInt(str[0]); //make the B to 11 -- 00001011 tempWord[1] = CharToInt(str[1]); //make the 0 to 0 -- 00000000 chn = (tempWord[0] << 4) | tempWord[1]; //to change the BO to 10110000 return chn; } //UTF_8 转gb2312 void strCoding::UTF_8ToGB2312(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 Wtemp; UTF_8ToUnicode(&Wtemp,pText + i); UnicodeToGB2312(buf,Wtemp); unsigned short int tmp = 0; tmp = rst[j] = buf[0]; tmp = rst[j+1] = buf[1]; tmp = rst[j+2] = buf[2]; //newBuf[j] = Ctemp[0]; //newBuf[j + 1] = Ctemp[1]; i += 3; j += 2; } } rst[j]='\0'; pOut = rst; delete []rst; } //GB2312 转为 UTF-8 void strCoding::GB2312ToUTF_8(string& pOut,char *pText, int pLen) { char buf[4]; memset(buf,0,4); pOut.clear(); int i = 0; while(i < pLen) { //如果是英文直接复制就可以 if( pText[i] >= 0) { char asciistr[2]={0}; asciistr[0] = (pText[i++]); pOut.append(asciistr); } else { WCHAR pbuffer; Gb2312ToUnicode(&pbuffer,pText+i); UnicodeToUTF_8(buf,&pbuffer); pOut.append(buf); i += 2; } } return; } //把str编码为网页中的 GB2312 url encode ,英文不变,汉字双字节 如%3D%AE%88 string strCoding::UrlGB2312(char * str) { string dd; size_t len = strlen(str); for (size_t i=0;i<len;i++) { if(isalnum((BYTE)str[i])) { char tempbuff[2]; sprintf(tempbuff,"%c",str[i]); dd.append(tempbuff); } else if (isspace((BYTE)str[i])) { dd.append("+"); } else { char tempbuff[4]; sprintf(tempbuff,"%%%X%X",((BYTE*)str)[i] >>4,((BYTE*)str)[i] %16); dd.append(tempbuff); } } return dd; } //把str编码为网页中的 UTF-8 url encode ,英文不变,汉字三字节 如%3D%AE%88 string strCoding::UrlUTF8(char * str) { string tt; string dd; GB2312ToUTF_8(tt,str,(int)strlen(str)); size_t len=tt.length(); for (size_t i=0;i<len;i++) { if(isalnum((BYTE)tt.at(i))) { char tempbuff[2]={0}; sprintf(tempbuff,"%c",(BYTE)tt.at(i)); dd.append(tempbuff); } else if (isspace((BYTE)tt.at(i))) { dd.append("+"); } else { char tempbuff[4]; sprintf(tempbuff,"%%%X%X",((BYTE)tt.at(i)) >>4,((BYTE)tt.at(i)) %16); dd.append(tempbuff); } } return dd; } //把url GB2312解码 string strCoding::UrlGB2312Decode(string str) { string output=""; char tmp[2]; int i=0,idx=0,ndx,len=str.length(); while(i<len){ if(str[i]=='%'){ tmp[0]=str[i+1]; tmp[1]=str[i+2]; output += StrToBin(tmp); i=i+3; } else if(str[i]=='+'){ output+=' '; i++; } else{ output+=str[i]; i++; } } return output; } //把url utf8解码 string strCoding::UrlUTF8Decode(string str) { string output=""; string temp =UrlGB2312Decode(str);// UTF_8ToGB2312(output,(char *)temp.data(),strlen(temp.data())); return output; } generalhking:在VS2008下编译实验可用,VC6下不可用。 VS08下实验如下: [cpp] view plaincopyprint? // TestUrlClass.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "strCoding.h" int _tmain(int argc, _TCHAR* argv[]) { strCoding stdCd; string str = "一只可爱的小花猫,MS输入测试 空格,大学。Hello world,混合编码,HK@hit.edu.cn,#试#,%试,&,+++,、,/、\, =连接,?, . :请注意:"; string urlrlt = stdCd.UrlGB2312((char*)str.c_str()); cout<<urlrlt<<endl; string utldec = stdCd.UrlGB2312Decode(urlrlt); cout<<utldec<<endl; system("pause"); return 0; }
结果:
http://blog.csdn.net/generalhking/article/details/8233824
发表评论
-
必要加载文件
2014-12-04 10:57 0必要加载文件 -
ce测试
2013-11-13 13:01 0ce测试 http:// -
MFC URL编码(UTF8和GB2312)
2013-04-23 11:30 1032// 进行Url编码 UTF-8 CString ... -
visual c 6.0 编写串口程序release版本在非vc电脑上无法运行的解决方法
2013-04-16 11:10 1814近日给编写了一个串口与单片机的程序,却发现生成的release ... -
MFC调用脚本(javascript ,vbscript)的类
2013-03-28 09:49 1375上次看到论坛一会员求助 ,就花了点时间整理了下,方面大家的使用 ... -
MFC字符Unicode转UTF-8
2013-03-21 17:24 3993unicode的环境下,写中文到文件,会出现乱码。 解决方法 ... -
[转]C++URL编码和解码
2013-03-21 16:02 2900以下是url中可能用到的特殊字符及在url中的经过编码后的值: ...
相关推荐
C++作为一门强大的系统级编程语言,虽然没有内置的URL编码和解码函数,但开发者可以借助标准库和第三方库来实现这些功能。本文将深入探讨C++中如何进行URL编码和解码。 URL(Uniform Resource Locator)是互联网上...
在提供的代码中,我们看到一个名为`strCoding`的C++类,这个类提供了一些方法来处理UTF-8和GB2312编码之间的转换,以及URL编码和解码。以下是对这些方法的详细解释: 1. `UTF_8ToGB2312`:这个函数将UTF-8编码的...
- 可以编写一个简单的C++程序,包含一个URL编码函数和一个解码函数,分别对输入的URL字符串进行编码和解码,然后输出结果进行验证。 9. **错误处理** - 实际编程中,要考虑到可能出现的错误情况,比如非法的编码...
linux系统c++实现的url和base64编解码 在webserver中会使用 自己实现的一个webserver,详见https://download.csdn.net/download/k117470154/10234299
本话题将详细探讨“url编码解码源代码”,以及如何在CGI(Common Gateway Interface)环境中处理这些编码。 首先,让我们理解URL编码的基本原理。在URL中,某些字符具有特殊含义,如空格通常代表路径分隔,而问号...
`Encode_ Decode Tools`是一款用于URL编码和解码的工具,它可以帮助开发者和用户方便地处理这些编码问题。这款工具可能提供了简单的用户界面,允许用户输入URL或字符串,然后点击按钮进行编码或解码操作。它支持对...
这个"URL编解码程序"就是针对这一需求开发的,主要用于网络爬虫技术中处理URL的编码和解码问题。 URL编解码主要遵循两个标准:RFC 3986(统一资源标识符的通用语法)和ISO/IEC 8859-1(拉丁字母的一号字符集)。在...
5. **组件结构**:根据提供的文件名`URL.cpp`和`URL.h`,这个组件可能包含一个名为`URL`的类,封装了URL编解码的核心功能。`.cpp`文件包含了类的实现,而`.h`文件则定义了类接口,供其他模块调用。 6. **使用示例**...
本文不仅介绍了URL编码的基本概念和重要性,还提供了一个C/C++版本的具体实现示例。通过对这个示例的理解,可以帮助开发者更好地理解URL编码的工作原理及其在实际项目中的应用。同时,这个示例也为需要进行类似功能...
`cpp-base64-master`可能是一个开源项目,它提供了C++实现Base64编码和解码的示例。该项目可能包含了一个或多个类或函数,用于进行Base64转换。通常,这样的库会提供一个接口,如`encodeBase64(const std::string& ...
总之,URL编码和解码是网络编程中基础但重要的部分,通过C++我们可以实现自定义的函数或者利用现有库来处理这个问题。同时,了解和处理Win32与Linux之间的平台差异,可以确保代码在不同操作系统上都能正确运行。
Base64编码基于64个字符的字符集,包括大小写字母、数字以及"+"和"/",并且通常在末尾添加一个或多个等于号("=")作为填充。 在C++中实现Base64编解码,我们可以从以下几个方面进行详细解释: 1. **编码原理**:...
对于想要学习二维码技术或进行相关开发的人来说,这是一个宝贵的资源,因为用户可以在VC6.0这样的环境中编译和运行程序,了解其内部工作原理。 总结来说,这个"QR二维码编码及解码程序"涵盖了二维码的核心技术和...
3. `IsBase64`: 可能存在一个辅助函数,用于快速检查一个字符串是否已经是有效的Base64编码。 4. `Base64UrlSafeEncode/Decode`: 除了标准的Base64,还有Base64URL无填充版本,它用`-`代替`+`,`_`代替`/`,并且不...
接下来的`urlEncoding`函数是核心部分,它接受一个`wxString`类型的参数`sIn`,并返回一个新的`wxString`对象,该对象包含了原字符串按照UTF-8编码格式进行URL编码的结果。函数内部遍历了输入字符串的每一个字符,...
总的来说,cppcodec是一个实用且高效的编码解码库,特别适合那些希望快速添加Base64、Base32和Hex编码解码功能到C++项目的开发者。其仅包含头文件的设计使得集成过程变得简单,而一致的API则提高了开发效率和代码...
提供的"Base64ED"可能是一个包含Base64编码、转换和解码功能的代码库,可以方便地在程序中直接引用,以处理Base64相关的编码解码任务。 Base64编码的优点在于简单且易于实现,但也有其缺点,如编码后的数据长度会比...
QR码编码器C++汉化版是一个专门为C++编程语言设计的工具,它允许开发者将数据编码成QR码,这是一种广泛应用于条形码技术的二维矩阵码。QR码(Quick Response Code)最初由日本Denso Wave公司开发,因其快速读取和大...
例如,使用易语言的“系统支持”模块,或引入C++编写的动态链接库来实现更高效的Base64编码和解码。 综上所述,提高易语言中Base64编码转图片的速度,需要深入了解编码原理,熟练运用编程技巧,并结合系统特性进行...