MFC项目中多字节字符集和unicode的Cstring有什么区别?

gimao 2010-06-15 06:45:48
我下载了一个URLENCODE的程序来对URL中的中文字符转换,

但是,我使用多字节字符集和UNICODE的 转换出来的都不一样,不知道是为什么,我是新手,请不要笑我,呵呵。

CString CURLEncode::URLEncode(CString pcsEncode)

传进的PCSeNCODE都是一致的,不知道,为什么转出来不一样,是不是还做做什么处理?
...全文
432 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
辰岡墨竹 2011-09-02
  • 打赏
  • 举报
回复
URL编码一般必须使用Unicode,不能使用ANSI编码。所以你得用CStringW
柚子毛驴 2011-09-02
  • 打赏
  • 举报
回复
mark
zswhust 2011-09-02
  • 打赏
  • 举报
回复
mark
sharp0309 2010-06-15
  • 打赏
  • 举报
回复
mark
arong1234 2010-06-15
  • 打赏
  • 举报
回复
这当然不同了,MCBS下,“中国”使用GB2312编码,对应四个字节 D6 D0 B9 FA
Unicode编码下,“中国”对应2D 4E FD 56

其内容完全变了,url 编码后自然也不可能一样
gimao 2010-06-15
  • 打赏
  • 举报
回复
相同的函数,相同的字符串,得到的结果不一样。
// HEX Values array
char hexVals[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
// UNSAFE String
CString CURLEncode::csUnsafeString= _T("\"<>%\\^[]`+$,@:;/!#?=&");

// PURPOSE OF THIS FUNCTION IS TO CONVERT A GIVEN CHAR TO URL HEX FORM
CString CURLEncode::convert(char val)
{
CString csRet;
csRet += "%";
csRet += decToHex(val, 16);
return csRet;
}

// THIS IS A HELPER FUNCTION.
// PURPOSE OF THIS FUNCTION IS TO GENERATE A HEX REPRESENTATION OF GIVEN CHARACTER
CString CURLEncode::decToHex(char num, int radix)
{
int temp=0;
CString csTmp;
int num_char;
num_char = (int) num;

// ISO-8859-1
// IF THE IF LOOP IS COMMENTED, THE CODE WILL FAIL TO GENERATE A
// PROPER URL ENCODE FOR THE CHARACTERS WHOSE RANGE IN 127-255(DECIMAL)
if (num_char < 0)
num_char = 256 + num_char;

while (num_char >= radix)
{
temp = num_char % radix;
num_char = (int)floor(double(num_char / radix));
csTmp = hexVals[temp];
}

csTmp += hexVals[num_char];

if(csTmp.GetLength() < 2)
{
csTmp += '0';
}

CString strdecToHex(csTmp);
// Reverse the String
strdecToHex.MakeReverse();

return strdecToHex;
}

// PURPOSE OF THIS FUNCTION IS TO CHECK TO SEE IF A CHAR IS URL UNSAFE.
// TRUE = UNSAFE, FALSE = SAFE
bool CURLEncode::isUnsafe(char compareChar)
{
bool bcharfound = false;
char tmpsafeChar;
int m_strLen = 0;

m_strLen = csUnsafeString.GetLength();
for(int ichar_pos = 0; ichar_pos < m_strLen ;ichar_pos++)
{
tmpsafeChar = csUnsafeString.GetAt(ichar_pos);
if(tmpsafeChar == compareChar)
{
bcharfound = true;
break;
}
}
int char_ascii_value = 0;
//char_ascii_value = __toascii(compareChar);
char_ascii_value = (int) compareChar;

if(bcharfound == false && char_ascii_value > 32 && char_ascii_value < 123)
{
return false;
}
// found no unsafe chars, return false
else
{
return true;
}

return true;
}
// PURPOSE OF THIS FUNCTION IS TO CONVERT A STRING
// TO URL ENCODE FORM.
CString CURLEncode::URLEncode(CString pcsEncode)
{
int ichar_pos;
CString csEncode = _T("");
CString csEncoded = _T("");
int m_length;
int ascii_value;

csEncode = pcsEncode;
m_length = csEncode.GetLength();

for(ichar_pos = 0; ichar_pos < m_length; ichar_pos++)
{
char ch = csEncode.GetAt(ichar_pos);
if (ch < ' ')
{
ch = ch;
}
if(!isUnsafe(ch))
{
// Safe Character
csEncoded += CString(ch);
}
else
{
// get Hex Value of the Character
csEncoded += convert(ch);
}
}


return csEncoded;

}
stjay 2010-06-15
  • 打赏
  • 举报
回复
可能URLEncode里是转成BYTE来运算的
Eleven 2010-06-15
  • 打赏
  • 举报
回复
谁知道你的URLEncode里做了什么处理呢?

16,472

社区成员

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

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

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