【转】一个URL编码和解码的C++类

摘要:
下面的代码实现了一个用于C++中转码的类strCoding。里面有UTF8、UNICODE、GB2312编码的互相转换。

下面的代码实现了一个用于C++中转码的类strCoding。里面有UTF8、UNICODE、GB2312编码的互相转换。

.H文件:

#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

#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(charch){
        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];
        charchn;

        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

        returnchn;
}


//UTF_8 转gb2312
void strCoding::UTF_8ToGB2312(string &pOut, char *pText, intpLen)
{
     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]='

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇morphia(1)-基础vmware-tools安装指南下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

VC++ 复制整个文件夹

CopyFile只能复制一个文件,要想复制整个文件夹的所有文件,需要遍历文件夹里面的文件。 MyFile.h #pragma once #include <string> #include <Windows.h> #include <iostream> #include <stdio.h> #include...

Linux网络编程——进程池实现过程详解(2)

进程池功能升级: send_recv_syn同步机制 自定义设置函数recvCycle,确保双方收发机制正常 客户端中显示下载进度 time/slice两种方法 设置异常情况 客户端在下载中突然断开,原先的服务端会一直死循环打印 服务器突然断开,客户端全部死循环 服务器断开后,再次执行同一端口会出现异常 服务器要升级,通知客户端有序退出 如果业务...

网上购物车数据库设计

一、概述 网上购物店的数据模型,它主要模式有产品:product ,帐户:Account,定单:Order。和产品相关的表有category ,product,item, inventory, supplier;和用户相关表有的account ,signon ,profile;和定单相关的表有orders,orderstatus,lineitem FK:...

python3对文件编码的转换处理

  前言:   公司同事邀我一起给SQLSERVER 2008导数, 数据来源有高斯和ORACLE, 数据文件保存格式有UTF-8和GBK。   当我在做测试导入的时候发现SQLSERVER 2008数据库的WITH选项不支持CODEPAGE='65001', 即UTF-8文件编码格式导入。 所以需要把UTF-8编码的文件 统一转换成GBK, 代码如下。...

vs2010驱动开发环境配置

1、文件 -> 新建 -> 项目 -> Visual C++ -> 空项目 名称:Driver 2、生成 -> 配置管理器   活动解决方案配置: 新建 名称:Driver Debug 从此处复制设置:Debug 3、视图 -> 属性管理器  展开刚配置的Driver Debug | Win32  ->  右...

mac 获得进程信息的方法

NSProcessInfo可以获得当前进程的信息。获得所有活动进程信息可以尝试使用下面的方法。 进程的信息可以通过ps命令得到也可以通过sysctl方法得到。 但是我总是不能获取进程的流量信息,关于这一点很纠结,现在的想法就是如果能够获取进程的网络端口,然后对端口进行监听,统计其流量,但是如何能够获取进程的网络端口? 在linux中可以通过netstat...