还是处理中文英文和标点的问题 现在手上有个字符串"\xce\xef\xc1\xf7%20\xb9\xab\xcb\xbe%20mailto"如何变成 "物流 公司 mailto" 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CString str( "\xce\xef\xc1\xf7%20\xb9\xab\xcb\xbe%20mailto" ); str.Replace( "%20", " " ) ; TRACE( "%s\n", str ) ; 用什么编码我也在处理中文的问题,使用UNICODE确实很多想不到的现象你最好把代码贴出来看看 楼上,str.Replace( "%20", " " ) ;含义是???? str.Replace( "%20", " " );目的是为了替换空格因为%20的UNICODE解码就是空格的意思 CString CTest6Dlg::WebStr2Str(LPCSTR lpBuf){ int nLen; if( !lpBuf ) nLen = 0; else nLen = ::lstrlen(lpBuf); CString s; int i = 0; while( i < nLen ) { if( lpBuf[i] == '%' ) { BYTE c1=lpBuf[i+1]; BYTE c2=lpBuf[i+2]; i+=2; if(c1>='0' && c1<='9') c1 = (c1-'0')*16; else if(c1>='A' && c1<='Z') c1 = (c1-'A'+10)*16; else if(c1>='a' && c1<='a') c1 = (c1-'a'+10)*16; if(c2>='0' && c2<='9') c2 = c2-'0'; else if(c2>='A' && c2<='Z') c2 = c2-'A'+10; else if(c2>='a' && c2<='z') c2 = c2-'a'+10; char szStr[2]; szStr[0] = c1+c2; szStr[1] = 0; s += szStr; } else if( lpBuf[i] == '+' ) s+=" "; else s+=CString(&lpBuf[i],1); i++; } return s;}CString str1 = WebStr2Str("\xce\xef\xc1\xf7%20\xb9\xab\xcb\xbe%20mailto"); "\xce\xef\xc1\xf7%20\xb9\xab\xcb\xbe%20mailto"这个字符串就是“物流%20公司%20mailto“所以只需将%20替换为空格就满足你的需求了。因此一楼的就可以了。不用象小三这么复杂 把\x去掉,然后把生成的buffer,调用WideCharToMultiByte 哦,这个不是unicode,就把\x去掉就好了 有点儿麻烦,你自己提炼吧void convertstr(char *out, const char *in){ char dest[1024]; memset(dest, 0, 1024); int sz = strlen(in); char ch; int len = 0, hi, li; for(int i = 0; i < sz; i++) { if(in[i] >= 'A' && in[i] <= 'Z') //A-Z { dest[len] = in[i]; len += 1; } else if(in[i] >= 'a' && in[i] <= 'z') //a-z { dest[len] = in[i]; len += 1; } else if(in[i] >= '0' && in[i] <= '9') //0-9 { dest[len] = in[i]; len += 1; } else if(in[i] == '-' || in[i] == '_' || in[i] == '.' //reserve || in[i] == '!' || in[i] == '~' || in[i] == '*' || in[i] == '\\' || in[i] == '(' || in[i] == ')' || in[i] == '/' || in[i] == ':') { dest[len] = in[i]; len += 1; } else if(in[i] == '%' && in[i+1] == '2' && in[i+2] == '0') { dest[len] = ' '; len += 1; i += 2; } else if((in[i] == '\\') && ((in[i + 1] == 'x') || (in[i + 2] == 'X'))) { //先将%e4中的e4转化成数值 ch = in[i + 2]; if(ch >= 97 && ch <= 102) hi = 10 + (ch - 97); else if(ch >= 65 && ch <= 70) hi = 10 + (ch - 65); else hi = atoi(&ch); hi = hi << 4; ch = in[i + 3]; if(ch >= 97 && ch <= 102) li = 10 + (ch - 97); else if(ch >= 65 && ch <= 70) li = 10 + (ch - 65); else li = atoi(&ch); int ret = hi + li; dest[len] = ret; len += 1; i += 2; } else //已经是汉字的不做转换,防止2次解码出问题 { dest[len] = in[i]; len += 1; } } dest[len] = '\0'; memcpy(out, dest, strlen(dest));}void main(){ char result[1024]; memset(result, 0, 1024); const char *sam = "\xce\xef\xc1\xf7%20\xb9\xab\xcb\xbe%20mailto"; convertstr(result, sam); printf(result); system("pause");} len是输出字符串的长度,你可以返回 在调试状态下的程序是否还会收到消息? api异步选择为啥客户端连不上去? 请问如何把VC写好的类引用到DELPHI里? 想在电脑上做个类似网页中的“提交”按钮执行的功能。 关于内联函数的疑惑 一个关于CreateFile的奇怪问题. 求小号多开原理 请问高手,如何在IE浏览器中嵌入一个图标,像安装了金山毒霸后就会出现一个金山毒霸的图标。 问一个显示bmp图像的问题?多谢 想从光盘的数据库中提取出所需要数据,它是可执行文件。 急用! 关于VC的古怪问题
str.Replace( "%20", " " ) ;
TRACE( "%s\n", str ) ;
我也在处理中文的问题,使用UNICODE
确实很多想不到的现象
你最好把代码贴出来看看
目的是为了替换空格
因为%20的UNICODE解码就是空格的意思
{
int nLen; if( !lpBuf )
nLen = 0;
else
nLen = ::lstrlen(lpBuf); CString s;
int i = 0;
while( i < nLen )
{
if( lpBuf[i] == '%' )
{
BYTE c1=lpBuf[i+1];
BYTE c2=lpBuf[i+2];
i+=2; if(c1>='0' && c1<='9')
c1 = (c1-'0')*16;
else
if(c1>='A' && c1<='Z')
c1 = (c1-'A'+10)*16;
else
if(c1>='a' && c1<='a')
c1 = (c1-'a'+10)*16; if(c2>='0' && c2<='9')
c2 = c2-'0';
else
if(c2>='A' && c2<='Z')
c2 = c2-'A'+10;
else
if(c2>='a' && c2<='z')
c2 = c2-'a'+10; char szStr[2];
szStr[0] = c1+c2;
szStr[1] = 0;
s += szStr;
}
else
if( lpBuf[i] == '+' )
s+=" ";
else
s+=CString(&lpBuf[i],1); i++;
}
return s;
}CString str1 = WebStr2Str("\xce\xef\xc1\xf7%20\xb9\xab\xcb\xbe%20mailto");
这个字符串就是“物流%20公司%20mailto“
所以只需将%20替换为空格就满足你的需求了。因此一楼的就可以了。不用象小三这么复杂
void convertstr(char *out, const char *in)
{
char dest[1024];
memset(dest, 0, 1024);
int sz = strlen(in); char ch;
int len = 0, hi, li; for(int i = 0; i < sz; i++)
{
if(in[i] >= 'A' && in[i] <= 'Z') //A-Z
{
dest[len] = in[i];
len += 1;
}
else if(in[i] >= 'a' && in[i] <= 'z') //a-z
{
dest[len] = in[i];
len += 1;
}
else if(in[i] >= '0' && in[i] <= '9') //0-9
{
dest[len] = in[i];
len += 1;
}
else if(in[i] == '-' || in[i] == '_' || in[i] == '.' //reserve
|| in[i] == '!' || in[i] == '~' || in[i] == '*'
|| in[i] == '\\' || in[i] == '(' || in[i] == ')'
|| in[i] == '/' || in[i] == ':')
{
dest[len] = in[i];
len += 1;
}
else if(in[i] == '%' && in[i+1] == '2' && in[i+2] == '0')
{
dest[len] = ' ';
len += 1;
i += 2;
}
else if((in[i] == '\\') && ((in[i + 1] == 'x') || (in[i + 2] == 'X')))
{ //先将%e4中的e4转化成数值
ch = in[i + 2];
if(ch >= 97 && ch <= 102)
hi = 10 + (ch - 97);
else if(ch >= 65 && ch <= 70)
hi = 10 + (ch - 65);
else
hi = atoi(&ch); hi = hi << 4; ch = in[i + 3];
if(ch >= 97 && ch <= 102)
li = 10 + (ch - 97);
else if(ch >= 65 && ch <= 70)
li = 10 + (ch - 65);
else
li = atoi(&ch); int ret = hi + li; dest[len] = ret; len += 1;
i += 2;
}
else //已经是汉字的不做转换,防止2次解码出问题
{
dest[len] = in[i];
len += 1;
}
}
dest[len] = '\0';
memcpy(out, dest, strlen(dest));
}void main()
{
char result[1024];
memset(result, 0, 1024);
const char *sam = "\xce\xef\xc1\xf7%20\xb9\xab\xcb\xbe%20mailto"; convertstr(result, sam); printf(result); system("pause");
}