问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c++或MFC中,有没有两个类似的函数可以实现JAVA中的escape,encodeURI这两个函数的功能!

发布网友 发布时间:2022-10-18 01:17

我来回答

1个回答

热心网友 时间:2023-11-05 13:11

我们字符转换常用这个,注意函数是自己写的
#ifndef CChineseItemCode_H
#define CChineseItemCode_H
#include "Common.h"
#include <string>
using namespace std;

/***********************************************************
中 文 转 码 用法:
cout << ChineseItem("测试中文字符串")._gb2312() << endl;

可以将gb2312转为utf8

网上很多代码在vc2008下不可用,因此改写了一份

在vs2008下测试可实现中文转码
***********************************************************/
class ChineseItem
{
public:
// 默认构造函数
ChineseItem() : m_mystring(""),m_output("") {}
// 构造函数重载
ChineseItem( string szString ) : m_mystring(szString) {}
// 析构
~ChineseItem(){};
// 类型转换运算符
const char* c_str() //不转码,返回
{
return m_mystring.c_str();
}
const char* _gb2312() //转码为 gb2312,并返回
{
m_output=GB2312ToUTF_8(m_mystring.data(), (int)strlen(m_mystring.data()));
return m_output.c_str();
}

// 复制运算
ChineseItem operator=( string szString )
{
m_mystring = szString;
return m_mystring;
}
// 加号运算符
ChineseItem operator+( string szString )
{
//GB2312ToUTF_8( m_output, szString.data(), strlen( szString.data() ) );
m_mystring += szString;
return m_mystring;
}
ChineseItem operator+=( string szString )
{
//GB2312ToUTF_8( m_output, szString.data(), strlen( szString.data() ) );
m_mystring += szString;
return m_mystring;
}
private:
BYTE toHex(const BYTE &x);
void UTF_8ToUnicode(WCHAR* pOut,const char *pText);
void UnicodeToUTF_8(char* pOut,WCHAR* pText);
void UnicodeToGB2312(char* pOut,unsigned short uData);
void Gb2312ToUnicode(WCHAR* pOut,const char *gbBuffer);
string GB2312ToUTF_8(const char *pText,int pLen); //gb2312 => utf8
string UTF_8ToGB2312(const char *pText,int pLen);//utf8 => gb2312
//CString UTF8_Encode(LPTSTR strUnicode);
//CString URLEncode(CString sIn);
string m_mystring;
string m_output;
};

BYTE ChineseItem::toHex(const BYTE &x)
{
return (x>9?x+55:x+48);
}

// 把UTF-8转换成Unicode
void ChineseItem::UTF_8ToUnicode(WCHAR* pOut,const 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);

}

// Unicode 转换成UTF-8
void ChineseItem::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));

}

// 把Unicode 转换成 GB2312
void ChineseItem::UnicodeToGB2312(char* pOut,unsigned short uData)
{
WideCharToMultiByte(CP_ACP,NULL,LPCWSTR(uData),1,pOut,sizeof(WCHAR),NULL,NULL);
}

// GB2312 转换成 Unicode
void ChineseItem::Gb2312ToUnicode(WCHAR* pOut,const char *gbBuffer)
{
::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);
}

//GB2312 转为 UTF-8
string ChineseItem::GB2312ToUTF_8(const char *pText,int pLen)
{
string pOut;
char buf[1024];
char* rst = new char[pLen+(pLen>>2)+2];

memset(buf,0,1024);
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;
}
}
strcpy_s(&rst[j],1,"\0");
//返回结果
pOut = rst;

return pOut;
}

//UTF-8 转为 GB2312
string ChineseItem::UTF_8ToGB2312(const char *pText,int pLen)
{
string pOut;
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;
}
}
strcpy_s(&newBuf[j],1,"\0");

pOut = newBuf;

return pOut;
}

#endif

c++有自己的宽窄字符转换,网上很好找
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
脾基本简介 人体有2个脾脏吗 百度百科 人的脾有几个 我是无锡的,公司需要办理健康证,请问应该到哪里去办理? 儿童健康小常识:让宝宝快乐成长 如何构建认罪认罚案件相对不起诉适用标准 相对不起诉概述 杨笠脱口秀称男人没底线,直言没有男人生活会更幸福,你认可吗? 每个人都是独立的个体都有自己生活的选择方式和权利,别人不要干涉... ...人观点,是我的自由、我的权利别人无权 干涉”这种观点 Java&#47;JavaScript:编码的函数为什么起名叫escape呢?有什么特殊含义吗? JAVA编译出错escape文字不对,怎么解决。 oscache和ehcache的区别 豉汁煎海虾的做法是什么 豉汁虾怎么做 epoll知识点总结 上海补开过期病假条规定 还原氧化铁的具体步骤 氧化铁是实验室中的重要试剂,检验溶液中是否含正3价铁的方法是 请高手解决220v液压电磁阀的问题 请问如何判断220v的液压电磁阀坏了 求助,液压电磁阀线圈220V电阻无穷大,为什么 液压电磁阀线圈220V电阻无穷大,为什么通 凯里哪个书店有拼音字卡 春天吃青团,快用简单做法,不调馅料特省事,糯叽叽甜滋滋好解馋 清明花糍粑的做法 赞美老师和雨的诗句 老师和蔼细心的教育我们,真像春风,春雨,我们用什么诗句来表示? 老师像春雨的诗句 和雨有关的诗词 怎么在文件中植入脚本 在徽信中想个打羽毛球的群怎么找 延吉延边qq 微信羽毛球群 我在北京前门住时间比较充裕想找一起打羽毛球,本人水平处在瞎抡,有兴趣的一起锻炼的加微信 nange00544 厦门北大青鸟分享Java中异常与错误的处理方法? 在微粒贷上的借款可以分期吗? 椰子煲花胶鸡汤有什么功效 蒜茸粉丝豉汁蒸大虾怎么做如何 花胶炖鸡汤放什么材料好吃 雷雨好词好句 好雨的诗句 今年财神的位置? 农历20200216财神在什么方向? 2O2O年的财神在什么方向? 感恩老师的抒情文章 ANTEC VP450P这电源多少钱,保修多少时间? 火灾的发展过程一般可分为哪五个阶段? 燃烧过程分为几个阶段 做法,凉拌螺旋藻怎么做好吃,凉拌螺旋藻的家常做法 凉拌螺旋藻怎么做好吃