还是处理中文英文和标点的问题

babam 2004-10-22 04:28:48
现在手上有个字符串"\xce\xef\xc1\xf7%20\xb9\xab\xcb\xbe%20mailto"
如何变成 "物流 公司 mailto"
...全文
157 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
memory_xj 2004-10-23
  • 打赏
  • 举报
回复
一楼是正确的!
aspvbjava 2004-10-22
  • 打赏
  • 举报
回复
len是输出字符串的长度,你可以返回
aspvbjava 2004-10-22
  • 打赏
  • 举报
回复
有点儿麻烦,你自己提炼吧
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");
}
oyljerry 2004-10-22
  • 打赏
  • 举报
回复
去掉\x就好了
babam 2004-10-22
  • 打赏
  • 举报
回复
谢谢大家了!我试试好了
btbq 2004-10-22
  • 打赏
  • 举报
回复
up
roger_ding 2004-10-22
  • 打赏
  • 举报
回复
哦,这个不是unicode,就把\x去掉就好了
roger_ding 2004-10-22
  • 打赏
  • 举报
回复
把\x去掉,然后把生成的buffer,调用WideCharToMultiByte
快乐鹦鹉 2004-10-22
  • 打赏
  • 举报
回复
"\xce\xef\xc1\xf7%20\xb9\xab\xcb\xbe%20mailto"
这个字符串就是“物流%20公司%20mailto“
所以只需将%20替换为空格就满足你的需求了。因此一楼的就可以了。不用象小三这么复杂
lixiaosan 2004-10-22
  • 打赏
  • 举报
回复
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");
fcf128 2004-10-22
  • 打赏
  • 举报
回复
up
kugou123 2004-10-22
  • 打赏
  • 举报
回复
str.Replace( "%20", " " );
目的是为了替换空格
因为%20的UNICODE解码就是空格的意思
wang_bluebird 2004-10-22
  • 打赏
  • 举报
回复
楼上,str.Replace( "%20", " " ) ;含义是????
chcpu 2004-10-22
  • 打赏
  • 举报
回复
用什么编码
我也在处理中文的问题,使用UNICODE
确实很多想不到的现象
你最好把代码贴出来看看
sutra 2004-10-22
  • 打赏
  • 举报
回复
CString str( "\xce\xef\xc1\xf7%20\xb9\xab\xcb\xbe%20mailto" );
str.Replace( "%20", " " ) ;
TRACE( "%s\n", str ) ;

16,472

社区成员

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

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

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