`
liyuan66
  • 浏览: 14013 次
社区版块
存档分类
最新评论

[转]一个URL编码和解码的C++类

    博客分类:
  • c++
 
阅读更多
类转自:http://www.cnblogs.com/xiaoka/articles/2585189.html

下面的代码实现了一个用于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


  • 大小: 49.4 KB
分享到:
评论

相关推荐

    C++URL编码和解码

    C++作为一门强大的系统级编程语言,虽然没有内置的URL编码和解码函数,但开发者可以借助标准库和第三方库来实现这些功能。本文将深入探讨C++中如何进行URL编码和解码。 URL(Uniform Resource Locator)是互联网上...

    C++类URL编码和解码使用技巧

    在提供的代码中,我们看到一个名为`strCoding`的C++类,这个类提供了一些方法来处理UTF-8和GB2312编码之间的转换,以及URL编码和解码。以下是对这些方法的详细解释: 1. `UTF_8ToGB2312`:这个函数将UTF-8编码的...

    url编码与解码

    - 可以编写一个简单的C++程序,包含一个URL编码函数和一个解码函数,分别对输入的URL字符串进行编码和解码,然后输出结果进行验证。 9. **错误处理** - 实际编程中,要考虑到可能出现的错误情况,比如非法的编码...

    linux c++ url和base64编解码

    linux系统c++实现的url和base64编解码 在webserver中会使用 自己实现的一个webserver,详见https://download.csdn.net/download/k117470154/10234299

    url编码解码源代码

    本话题将详细探讨“url编码解码源代码”,以及如何在CGI(Common Gateway Interface)环境中处理这些编码。 首先,让我们理解URL编码的基本原理。在URL中,某些字符具有特殊含义,如空格通常代表路径分隔,而问号...

    Encode_ Decode Tools URL编码解码工具

    `Encode_ Decode Tools`是一款用于URL编码和解码的工具,它可以帮助开发者和用户方便地处理这些编码问题。这款工具可能提供了简单的用户界面,允许用户输入URL或字符串,然后点击按钮进行编码或解码操作。它支持对...

    URL编解码程序(自己写)

    这个"URL编解码程序"就是针对这一需求开发的,主要用于网络爬虫技术中处理URL的编码和解码问题。 URL编解码主要遵循两个标准:RFC 3986(统一资源标识符的通用语法)和ISO/IEC 8859-1(拉丁字母的一号字符集)。在...

    URL编解码组件

    5. **组件结构**:根据提供的文件名`URL.cpp`和`URL.h`,这个组件可能包含一个名为`URL`的类,封装了URL编解码的核心功能。`.cpp`文件包含了类的实现,而`.h`文件则定义了类接口,供其他模块调用。 6. **使用示例**...

    url编码转化,将url转化成unicode进行传输

    本文不仅介绍了URL编码的基本概念和重要性,还提供了一个C/C++版本的具体实现示例。通过对这个示例的理解,可以帮助开发者更好地理解URL编码的工作原理及其在实际项目中的应用。同时,这个示例也为需要进行类似功能...

    c++ base64 编码

    `cpp-base64-master`可能是一个开源项目,它提供了C++实现Base64编码和解码的示例。该项目可能包含了一个或多个类或函数,用于进行Base64转换。通常,这样的库会提供一个接口,如`encodeBase64(const std::string& ...

    URL.zip_url_url decode_url linux_url 解码

    总之,URL编码和解码是网络编程中基础但重要的部分,通过C++我们可以实现自定义的函数或者利用现有库来处理这个问题。同时,了解和处理Win32与Linux之间的平台差异,可以确保代码在不同操作系统上都能正确运行。

    base64编解码C/C++实现

    Base64编码基于64个字符的字符集,包括大小写字母、数字以及"+"和"/",并且通常在末尾添加一个或多个等于号("=")作为填充。 在C++中实现Base64编解码,我们可以从以下几个方面进行详细解释: 1. **编码原理**:...

    QR二维码编码及解码程序

    对于想要学习二维码技术或进行相关开发的人来说,这是一个宝贵的资源,因为用户可以在VC6.0这样的环境中编译和运行程序,了解其内部工作原理。 总结来说,这个"QR二维码编码及解码程序"涵盖了二维码的核心技术和...

    Base64系列第四篇 C/C++中使用Base64编码解码(从chromium库中抽取)

    3. `IsBase64`: 可能存在一个辅助函数,用于快速检查一个字符串是否已经是有效的Base64编码。 4. `Base64UrlSafeEncode/Decode`: 除了标准的Base64,还有Base64URL无填充版本,它用`-`代替`+`,`_`代替`/`,并且不...

    C++转UTF8编码.txt

    接下来的`urlEncoding`函数是核心部分,它接受一个`wxString`类型的参数`sIn`,并返回一个新的`wxString`对象,该对象包含了原字符串按照UTF-8编码格式进行URL编码的结果。函数内部遍历了输入字符串的每一个字符,...

    cpp-cppcodec只包括头文件的Cbase64编码解码库

    总的来说,cppcodec是一个实用且高效的编码解码库,特别适合那些希望快速添加Base64、Base32和Hex编码解码功能到C++项目的开发者。其仅包含头文件的设计使得集成过程变得简单,而一致的API则提高了开发效率和代码...

    Base64编码、转换、解码代码

    提供的"Base64ED"可能是一个包含Base64编码、转换和解码功能的代码库,可以方便地在程序中直接引用,以处理Base64相关的编码解码任务。 Base64编码的优点在于简单且易于实现,但也有其缺点,如编码后的数据长度会比...

    QR码编码器C++汉化版

    QR码编码器C++汉化版是一个专门为C++编程语言设计的工具,它允许开发者将数据编码成QR码,这是一种广泛应用于条形码技术的二维矩阵码。QR码(Quick Response Code)最初由日本Denso Wave公司开发,因其快速读取和大...

    易语言 base64编码转图片 如何 提高转换速度.zip

    例如,使用易语言的“系统支持”模块,或引入C++编写的动态链接库来实现更高效的Base64编码和解码。 综上所述,提高易语言中Base64编码转图片的速度,需要深入了解编码原理,熟练运用编程技巧,并结合系统特性进行...

Global site tag (gtag.js) - Google Analytics