(转)C++ UTF8 UrlEncode(宽字符)

#include <stdio.h>
#include <wchar.h>
#include <Windows.h>
#include <string>
using namespace std;

const wchar_t * hexenc[] = {
    L"%00", L"%01", L"%02", L"%03", L"%04", L"%05", L"%06", L"%07",
    L"%08", L"%09", L"%0a", L"%0b", L"%0c", L"%0d", L"%0e", L"%0f",
    L"%10", L"%11", L"%12", L"%13", L"%14", L"%15", L"%16", L"%17",
    L"%18", L"%19", L"%1a", L"%1b", L"%1c", L"%1d", L"%1e", L"%1f",
    L"%20", L"%21", L"%22", L"%23", L"%24", L"%25", L"%26", L"%27",
    L"%28", L"%29", L"%2a", L"%2b", L"%2c", L"%2d", L"%2e", L"%2f",
    L"%30", L"%31", L"%32", L"%33", L"%34", L"%35", L"%36", L"%37",
    L"%38", L"%39", L"%3a", L"%3b", L"%3c", L"%3d", L"%3e", L"%3f",
    L"%40", L"%41", L"%42", L"%43", L"%44", L"%45", L"%46", L"%47",
    L"%48", L"%49", L"%4a", L"%4b", L"%4c", L"%4d", L"%4e", L"%4f",
    L"%50", L"%51", L"%52", L"%53", L"%54", L"%55", L"%56", L"%57",
    L"%58", L"%59", L"%5a", L"%5b", L"%5c", L"%5d", L"%5e", L"%5f",
    L"%60", L"%61", L"%62", L"%63", L"%64", L"%65", L"%66", L"%67",
    L"%68", L"%69", L"%6a", L"%6b", L"%6c", L"%6d", L"%6e", L"%6f",
    L"%70", L"%71", L"%72", L"%73", L"%74", L"%75", L"%76", L"%77",
    L"%78", L"%79", L"%7a", L"%7b", L"%7c", L"%7d", L"%7e", L"%7f",
    L"%80", L"%81", L"%82", L"%83", L"%84", L"%85", L"%86", L"%87",
    L"%88", L"%89", L"%8a", L"%8b", L"%8c", L"%8d", L"%8e", L"%8f",
    L"%90", L"%91", L"%92", L"%93", L"%94", L"%95", L"%96", L"%97",
    L"%98", L"%99", L"%9a", L"%9b", L"%9c", L"%9d", L"%9e", L"%9f",
    L"%a0", L"%a1", L"%a2", L"%a3", L"%a4", L"%a5", L"%a6", L"%a7",
    L"%a8", L"%a9", L"%aa", L"%ab", L"%ac", L"%ad", L"%ae", L"%af",
    L"%b0", L"%b1", L"%b2", L"%b3", L"%b4", L"%b5", L"%b6", L"%b7",
    L"%b8", L"%b9", L"%ba", L"%bb", L"%bc", L"%bd", L"%be", L"%bf",
    L"%c0", L"%c1", L"%c2", L"%c3", L"%c4", L"%c5", L"%c6", L"%c7",
    L"%c8", L"%c9", L"%ca", L"%cb", L"%cc", L"%cd", L"%ce", L"%cf",
    L"%d0", L"%d1", L"%d2", L"%d3", L"%d4", L"%d5", L"%d6", L"%d7",
    L"%d8", L"%d9", L"%da", L"%db", L"%dc", L"%dd", L"%de", L"%df",
    L"%e0", L"%e1", L"%e2", L"%e3", L"%e4", L"%e5", L"%e6", L"%e7",
    L"%e8", L"%e9", L"%ea", L"%eb", L"%ec", L"%ed", L"%ee", L"%ef",
    L"%f0", L"%f1", L"%f2", L"%f3", L"%f4", L"%f5", L"%f6", L"%f7",
    L"%f8", L"%f9", L"%fa", L"%fb", L"%fc", L"%fd", L"%fe", L"%ff"
};

std::wstring UrlEncode(wstring& text)
{
    //wstring text(L"??? ??? ?( ) ?? ?????.");

    size_t len = text.length();
    std::wstring encoded = L"";
    for(size_t i = 0; i < len; i++)
    {
        wchar_t wch = text.at(i);
        if (‘A‘ <= wch && wch <= ‘Z‘) {
            encoded += wch;
        } else if (‘a‘ <= wch && wch <= ‘z‘) {
            encoded += wch;
        } else if (‘0‘ <= wch && wch <= ‘9‘) {
            encoded += wch;
        } 

        /*else if (wch == ‘ ‘) {
            encoded += hexenc[wch];
        } else if (wch == ‘-‘ || wch == ‘_‘
            || wch == ‘.‘ || wch == ‘!‘
            || wch == ‘~‘ || wch == ‘*‘
            || wch == ‘\‘‘ || wch == ‘(‘
            || wch == ‘)‘) {
                encoded += hexenc[wch];
        } else if (wch <= 0x007f) {        // other ASCII
            encoded += hexenc[wch];
            */
        else if (wch == ‘ ‘){
            encoded += L‘+‘;
        }else if(wch == ‘(‘
            || wch == ‘)‘){
            encoded += wch;
        } else if (wch == ‘-‘ || wch == ‘_‘
            || wch == ‘.‘ || wch == ‘!‘
            || wch == ‘~‘ || wch == ‘*‘
            || wch == ‘\‘‘ ) {
                encoded += hexenc[wch];
        } else if (wch <= 0x007f) {        // other ASCII
            encoded += hexenc[wch];

        } else if (wch <= 0x07FF) {        // non-ASCII <= 0x7FF
            encoded += hexenc[0xc0 | (wch >> 6)];
            encoded += hexenc[0x80 | (wch & 0x3F)];
        } else {                    // 0x7FF < ch <= 0xFFFF
            encoded += hexenc[0xe0 | (wch >> 12)];
            encoded += hexenc[0x80 | ((wch >> 6) & 0x3F)];
            encoded += hexenc[0x80 | (wch & 0x3F)];
        }
    }
    return encoded.c_str();//ref new String(encoded.c_str());
}

std::wstring UrlDecode(std::wstring& text)
{
    std::wstring decoded = L"";
    wchar_t temp[] = L"0x00";
    size_t len = text.length();
    int sequence = 0;
    wchar_t conwch = 0;
    for(size_t i = 0; i < len; i++)
    {
        wchar_t wch = text.at(i++);
        if((wch == ‘%‘) && (i+1 < len))
        {
            temp[2] = text.at(i++);
            temp[3] = text.at(i);
            long tconwch = wcstol(temp, NULL, 16);
            if(tconwch <= 0x7F) {
                decoded += tconwch; // normal ascii char
            } else if(tconwch >= 0x80 && tconwch <= 0xBF) { // partial byte
                tconwch = tconwch & 0x3F;
                if(sequence-- == 2)
                    tconwch = tconwch << 6;
                conwch |= tconwch;
                if(sequence == 0)
                    decoded += conwch;
            } else if(tconwch >= 0xC0 && tconwch <= 0xDF) {
                conwch = (tconwch & 0x1F) << 6; // make space for partial bytes
                sequence = 1; // 1 more partial bytes follow
            } else if(tconwch >= 0xE0 && tconwch <= 0xEF) {
                conwch = (tconwch & 0xF) << 12; // make space for partial bytes
                sequence = 2; // 2 more partial bytes follow
            } // TODO add case fore 3 partial bytes ... very rare
        } else {
            decoded += text.at(--i);
        }
    }
    return decoded;
}

void main()
{
    FILE *fp;
    wchar_t ch[2560];

    int index;
    for(index=0;index<2560;index++) ch[index]=L‘\0‘;

    if((fp=fopen("D:\\Work\\1013\\work\\MyProject\\bin\\INI\\Chinese.cfg","r,ccs=UTF-8"))==NULL)
    {
        printf("file cannot open!");
        return;
    } 

    int realcount=fread(&ch,1*sizeof(wchar_t),2560,fp);

    wstring ws(ch);
    wstring str=UrlEncode(ws);

    int len = WideCharToMultiByte(CP_ACP,0,str.c_str(),str.length()*sizeof(wchar_t),NULL,0,NULL,NULL);
    char* pbuf=new char[len+1];
    memset(pbuf,0,len+1);
    WideCharToMultiByte(CP_ACP,0,str.c_str(),str.length()*sizeof(wchar_t) ,pbuf,len + 1 ,NULL,NULL);
    std::string strRelt(pbuf);
    delete [] pbuf;

    getchar();
}

参考:
1,C++ UTF8 UrlEncode(宽字符)
http://www.cnblogs.com/newcj/p/3645749.html

时间: 2024-10-19 00:53:48

(转)C++ UTF8 UrlEncode(宽字符)的相关文章

宽字符、多字节、unicode、utf-8、gbk编码转化

今天遇到一个编码的问题,困惑了我很长时间,所以就简要的的了解了一下常用的编码类型. 我们最常见的是assic编码,它是一种单字节编码,对多容纳256个字符. 我们在编程的时候经常遇到unicode,unicode是一种宽字节编码,能够很好的融合世界各个国家的字符,具有国际通用性,所谓宽字符其实使用两个字节来表示一个符号. 而utf8是一种多字节编码,一个字符所占用的字节数不确定,是对unicode的精简版本,也用具有世界通用性.Gbk也是一种双字节编码,其实就是对中文简体的一种编码,不具有世界通

WP8 客户端C# UTF8 字符在转C++ 宽字符时失败问题。

有一段时间一直为编码格式的问题烦恼,某些编辑器在保存为UTF-8文件后,wp 客户端在从C#代码读取后转给C++保存为宽字符时,文本全部丢失,后查看官方文档:http://msdn.microsoft.com/zh-cn/library/vstudio/t3ayayh1 发现是EILSEQ错误,即有“非法字节序列”,可某些编辑器处理后没有这个问题. 在仔细区别两种编辑工具最后生成的文件时发现有3字节的容量差,网上就开始搜索,发现还真有人总结出来是由于UTF8 带BOM 与 无BOM 的差别导致(

彻底弄懂UTF-8、Unicode、宽字符、locale

目录 Unicode.UCS UTF8 结论: 宽字符类型wchar_t locale 为什么需要宽字符类型 多字节字符串和宽字符串相互转换 最近使用到了wchar_t类型,所以准备详细探究下,没想到水还挺深,网上的资料大多都是复制粘贴,只有个结论,也没个验证过程.本文记录探究的过程及结论,如有不对请指正. Unicode.UCS UCS(Universal Character Set)本质上就是一个字符集. Unicode的开发结合了国际标准化组织所制定的?ISO/IEC 10646,即通用字

gcc编译器对宽字符的识别

最早是使用VC++工具来学习C++,学的越多就越对VC挡住的我看不见的东西好奇,总想多接触一些开发环境,今日抽空摸索了一下CodeBlocks这个开源的IDE使用方法,配置的编译器是MinGW的gcc编译器,gcc编译多字节集的字符还没什么问题,但遇到宽字符,发现编译不通过,经过多方查找,发现gcc对宽字符的支持分规则同我用熟了的cl编译器有一些区别,具体用法如下: GNU   C/C++编译器gcc也可以正确支持wchar_t字符和字符串,但是源代码的保存格式必须符合下面条件:        

Android NDK 下的宽字符编码转换及icu库的使用(转)

原贴http://topic.csdn.net/u/20101022/16/1b2e0cec-b9d2-42ea-8d9c-4f1bb8320a54.html?r=70149216 ,看过并动手实现,记录下来以备再用. 如果是在java层,有String类可以很好的转换各种编码,在ndk下面就没有现成的公开的工具,不过可以用icu4c. ICU4C 是IBM的国际化开发组件ICU的C语言实现版本.在android系统里也有实现.ndk里面并没有公开可用的api,需要自己加载动态库来调用转换函数.

多字节字符与宽字符重新认识

一直都说,多字节字符,何为多字节,并不只是一个char就是了.英文的字符都是char能表示,但是中文字符,是2个字节表示的. 所以, char s[] = "ha哈哈";     int l = strlen(s);// 6     char c = s[2];// -71 '?' cannot represent s 是占7个字节. s[2]只是'哈'的前半部分,所以决不能写这样的比较代码!!!: if (s[2]=='哈') 所以,字符串中有中文时,一定要格外小心. 甚至,所有的C

通过编写串口助手工具学习MFC过程&mdash;&mdash;(三)Unicode字符集的宽字符和多字节字符转换

通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个串口助手再次熟悉一下MFC,并做了一下记录,以便方便以后查阅.做的过程中多是遇到问题直接百度和谷歌搜索来的,所以很多都是不求甚解,知其然不知其所以然.另外做此工具只是为了熟悉了解,许多功能还没有完善!(开发工具VS2008) (三)Unicode字符集的宽字符和多字节字符转换 在上一节<(二)通过&qu

宽字节(宽字符)注入

字节注入也是在最近的项目中发现的问题,大家都知道%df' 被PHP转义(开启GPC.用addslashes函数,或者icov等),单引号被加上反斜杠\,变成了 %df\',其中\的十六进制是 %5C ,那么现在 %df\' =%df%5c%27,如果程序的默认字符集是GBK等宽字节字符集,则MYSQL用GBK的编码时,会认为 %df%5c 是一个宽字符,也就是縗',也就是说:%df\' = %df%5c%27=縗',有了单引号就好注入了.比如: $conn = mysql_connect("lo

boost.log(八)宽字符记录

宽字符记录 Boost.Log支持包含本地字符集字符串的日志记录.基本上有两种方式做这件事.在 UNIX 系统上通常使用一些多字节字符编码 (例如 UTF-8) 用来表示本地字符.在这种情况下,Boost.Log库可以直接以纯 ASCII 的方式记录而不需要其它额外的设置. 在Windows 上常见的做法是使用宽字符串来表示本地字符串.此外大多数系统 API 也是使用的宽字符,这需要特定于 Windows 的接收器也支持宽字符.另一方面,通用的接收器,例如 TextFile,是面向字节的,你写入