全角转半角问题(急)

cocat 2011-05-25 08:47:24
在网上找了个代码,不知道有什么错误没,顺便能讲下原理最好~

void DBCToSBC(char *srcStr, char *str)
{
int ilen;
int i = 0, j = 0;
unsigned char ch1, ch2;

ilen = strlen(srcStr);

if ((ilen >= 128) || str == NULL)
{
return ;
}

for (i = 0; i < ilen; i++)
{
ch1 = srcStr[i];
ch2 = srcStr[i+1];

//全角英文
if(ch1 == 0xA3) //这里为什么是0xA3??
{
str[j++] = ch2 - 0x80;
i++;
continue;
}
//全角空格
else if((ch1 == 0xA1) && (ch2 == 0xA1)) // ??
{
str[j++] = 0x20;
i++;
continue;
}
//全角汉字
else if ((ch1 >= 0x81) && (ch1 <= 0xFE) && (ch2 >= 0x40) && (ch2 <= 0xFE)) //??
{
str[j++] = ch1;
str[j++] = ch2;
i++;
continue;
}

str[j++] = ch1;
}
str[j] = '\0';

return ;
}

...全文
183 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
relaxisland 2011-05-25
  • 打赏
  • 举报
回复
//全角英文
if(ch1 == 0xA3) //这里为什么是0xA3??
{
str[j++] = ch2 - 0x80;
i++;
continue;
}

因为字母+数字的全角编码是在第3区,它的第一个字符是0xA3
比如大写字母: 0xA3C1 - 0xA3DA

而大写字母的ascii编码是从0x41-- 0x5a 也就是全角编码的第二字节-0x80
cocat 2011-05-25
  • 打赏
  • 举报
回复
if(ch1 == 0xA3) //这里为什么是0xA3??
{
str[j++] = ch2 - 0x80;
i++;
continue;
}
英文这里有问题吧~
白云飘飘飘 2011-05-25
  • 打赏
  • 举报
回复
基本上可以,在GB中,0xA3A1-0xA3FD与ascii的0x21-0x7D具有一一对应关系,因此,去掉高字节,把低字节减0x80就得到相应的半角,空格做为特例处理,汉字不做转换。
jixingzhong 2011-05-25
  • 打赏
  • 举报
回复
这些应该都是全角字符的编码。
helloyewen 2011-05-25
  • 打赏
  • 举报
回复
那些 莫名其妙的 数字 可能是 一个 asc码吧
cocat 2011-05-25
  • 打赏
  • 举报
回复
能找个能用的函数最好~这个貌似问题很多

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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