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++有自己的宽窄字符转换,网上很好找