关于UTF-8的URLEncode的问题?急。。。

Eleven 2008-06-12 09:34:56
有一个网站用的utf-8的URL编码,用中文的话就会转成这种编码,比如说汉字“中国”就会转成“%E4%B8%AD%E5%9B%BD”,每三个位对应一个汉字,比如说%E4%B8%AD对应汉字的“中”,“%E5%9B%BD”对应中文汉字的“国”,请问一下这是怎么转的呢?在网上找了很久都是GB2312的URLEncode(比如中文的汉字“中国”就会转成“%D6%D0%B9%FA”每两位对应一个汉字),没有看到UTF-8的URLEncode,有的都是用ASP或是PHP写的,没有看到用C++写的,请高手看一下,在线等,急。。。
...全文
1530 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2008-06-12
  • 打赏
  • 举报
回复
pOut[0] = (0xE0 ¦ ((pchar[1] & 0xF0) >> 4));
pOut[1] = (0x80 ¦ ((pchar[1] & 0x0F) < < 2)) + ((pchar[1] & 0xC0) >> 6);
//这里错了,改成pOut[1] = (0x80 ¦ ((pchar[1] & 0x0F) < < 2)) + ((pchar[0] & 0xC0) >> 6);
pOut[2] = (0x80 ¦ (pchar[0] & 0x3F));
Eleven 2008-06-12
  • 打赏
  • 举报
回复
也谢谢akirya,你的方式也是对了,而且更简单
Eleven 2008-06-12
  • 打赏
  • 举报
回复
谢谢,问题已经解决了,有个地方写错了,结贴去
  • 打赏
  • 举报
回复
#include<windows.h>
#include<stdio.h>

int main(int argc, char* argv[])
{
char* pAnsi ="中国";
wchar_t unicode[32]={0};
MultiByteToWideChar( CP_ACP,0,pAnsi,strlen(pAnsi),unicode,31);

unsigned char sz[32]={0};
WideCharToMultiByte(CP_UTF8,0,unicode,wcslen(unicode),(LPSTR)sz,31,0,0);

char out[64]={0};
sprintf(out,"%%%X%%%X%%%X%%%X%%%X%%%X",sz[0],sz[1],sz[2],sz[3],sz[4],sz[5]);
MessageBox(0,out,0,0);
return 0;
}
胡椒爸爸 2008-06-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 akirya 的回复:]
MultiByteToWideChar(CP_ACP , ....

WideCharToMultiByte(CP_UTF8 , ...

就可以转换到utf-8 了
[/Quote]

正解
Eleven 2008-06-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jameshooo 的回复:]
http协议中没有utf-8到URLEncode的转换要求,即使转了服务器也不认识
[/Quote]
不是UTF-8到URLEncode的转换,是utf-8方式Encode,可以看http://www.seores.com/search/urlcode.asp,类似他的这样的效果
Eleven 2008-06-12
  • 打赏
  • 举报
回复
我现在关键是要把中文的转成UTF-8的URLEncode,可以看这个网站http://www.seores.com/search/urlcode.asp,他上面有转的例子,我现在就是想他的这样效果
yjgx007 2008-06-12
  • 打赏
  • 举报
回复
楼上都讲很清楚了,
BTW.
很多URL跟随的参数最好用Base64重新编/解码。
jameshooo 2008-06-12
  • 打赏
  • 举报
回复
URLEncode:仅用于URL串转换
HTTP请求/响应头:ANSI
utf-8:受控的文件内容
jameshooo 2008-06-12
  • 打赏
  • 举报
回复
http协议中没有utf-8到URLEncode的转换要求,即使转了服务器也不认识
Eleven 2008-06-12
  • 打赏
  • 举报
回复
void UTF8ToUnicode(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);
}
void UnicodeToGB2312(char* pOut,unsigned short uData)
{
WideCharToMultiByte(CP_ACP,NULL,(LPCWSTR)&uData,1,pOut,sizeof(WCHAR),NULL,NULL);
}
void UTF8ToGB2312(CString &pOut, char *pText, int pLen)
{
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;
UTF8ToUnicode(&Wtemp,pText + i);
UnicodeToGB2312(Ctemp,Wtemp);
newBuf[j] = Ctemp[0];
newBuf[j + 1] = Ctemp[1];
i += 3;
j += 2;
}
}
newBuf[j] = '\0';
pOut = newBuf;
delete []newBuf;
}
void GB2312ToUnicode(WCHAR* pOut,char *gbBuffer)
{
::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);
}

void UnicodeToUTF8(char* pOut,WCHAR* pText)
{
char* pchar = (char *)pText;

pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));
pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[1] & 0xC0) >> 6);
pOut[2] = (0x80 | (pchar[0] & 0x3F));
}
void GB2312ToUTF8(CString& pOut,char *pText,int pLen)
{
char buf[3];
int len=pLen+(pLen>>2)+2;
char* rst=new char[len];
memset(buf,0,4);
memset(rst,0,len);

int i=0,j=0;
while(i<pLen)
{
if(*(pText+i)>=0)
rst[j++]=pText[i++];
else
{
WCHAR pBuf;
GB2312ToUnicode(&pBuf,pText+i);
UnicodeToUTF8(buf,&pBuf);
unsigned short int temp=0;
temp=rst[j]=buf[0];
temp=rst[j+1]=buf[1];
temp=rst[j+2]=buf[2];

j+=3;
i+=2;
}
}
rst[j]='\0';
pOut=rst;
// delete[] rst;
}

这种转换不对,但不知道是那里错了,请高手帮忙看看!
CString strName("中国");
int len=strName.GetLength();
char *pText=new char[len];
memset(pText,0,len);
pText=strName.GetBuffer(len);
CString strRet="";
GB2312ToUTF8(strRet,pText,len);
//AfxMessageBox(strRet);
strRet=URLEncode(strRet);
AfxMessageBox(strRet);
strName.ReleaseBuffer();

MessageBox弹出的结果是”%E4%B9%AD%E5%99%BD“和正确结果“%E4%B8%AD%E5%9B%BD”有出处,不知道哪里错了,请高手看看这是那里 的问题??
  • 打赏
  • 举报
回复
MultiByteToWideChar(CP_ACP , ....

WideCharToMultiByte(CP_UTF8 , ...

就可以转换到utf-8 了
  • 打赏
  • 举报
回复
MultiByteToWideChar(CP_ACP , ...

WideCharToMultiByte(CP_UTF8 , ...
就能转换成utf-8编码了

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧