怎么将全角转换成半角?

wyh2002 2003-11-19 05:14:44
在一个字符串中如果有全角和半角的字符,如何将全角转换成半角?或者是整串字符串都是全角的,将它转换成半角的?
例如:strContent = "11122222";--->strContent = "11122222";
strContent = "11111";---->strContent = "11111";
先谢了!
...全文
239 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Againstwind 2003-11-20
  • 打赏
  • 举报
回复
如果只是数字和英文字符的话,是否可以通过字符编码范围的判断来将全叫转换为半角。
如:先判断字符串中是否有全角字符,有几个,然后霸全角字符一个个读出来,再后判断是在哪个字符编码范围内,最终确认事什麽字符,然后就可以用对应的半角字符替换了!
只是个想法,不只可用否?

wyh2002 2003-11-20
  • 打赏
  • 举报
回复
有人知道吗?急的啊
wyh2002 2003-11-20
  • 打赏
  • 举报
回复
终于解决了,非常感谢各位帮忙!!
topwork 2003-11-20
  • 打赏
  • 举报
回复
刚才的代码会把汉字转坏,用下面的吧。
BOOL Half2All(const BYTE *pBuf , int in_size , BYTE *pOut , int *out_size)
{
if(!pBuf)
{
return FALSE;
}
if(!pOut)
{
return FALSE;
}

if(*out_size < (in_size * 2 + 1))
{
*out_size = in_size * 2 + 1;
return FALSE;
}

BYTE *pBt1 = new BYTE[in_size + 1];
memset(pBt1 , 0 , in_size+1);
memcpy(pBt1 , pBuf , in_size);

BYTE *pBt2 = pOut;
for(int i = 0 ; i <= in_size ; i++)
{
if(*pBt1 == 0x00)
{
*pBt2++ = *pBt1++;
}
else if(*pBt1 == 0xa3)
{
*pBt2++ = *pBt1++;
*pBt2++ = *pBt1++;
}
else if(*pBt1 < 0xa3)
{
*pBt2++ = 0xa3;
*pBt2++ = 0x80 + *pBt1++;
}
else
{
*pBt2++ = *pBt1++;
}
}
return TRUE;
}

BOOL All2Half(const BYTE *pBuf , int in_size , BYTE *pOut , int *out_size)
{
if(!pBuf)
{
return FALSE;
}
if(!pOut)
{
return FALSE;
}

if(*out_size < (in_size /2 + 1))
{
*out_size = in_size / 2 + 1;
return FALSE;
}

BYTE *pBt1 = new BYTE[in_size + 1];
memset(pBt1 , 0 , in_size+1);
memcpy(pBt1 , pBuf , in_size);

BYTE *pBt2 = pOut;
for(int i = 0 ; i < in_size ; i++)
{
if(*pBt1 == 0x00)
{
*pBt2++ = *pBt1++;
}
else if(*pBt1 == 0xa3)
{
pBt1++;
*pBt2++ = *pBt1++ - 0x80;
}
else
{
*pBt2++ = *pBt1++;
}
}
return TRUE;
}
topwork 2003-11-20
  • 打赏
  • 举报
回复
自己顶一下
topwork 2003-11-20
  • 打赏
  • 举报
回复
我刚刚帮你写了两个函数可以完成你的目的但是只能转换数字,英文字母(大小写),所有标点符号,对于汉字不行,你试试吧,有BUG自己改改,代码如下:
BOOL Half2All(const BYTE *pBuf , int in_size , BYTE *pOut , int *out_size)
{
if(!pBuf)
{
return FALSE;
}
if(!pOut)
{
return FALSE;
}

if(*out_size < (in_size * 2 + 1))
{
*out_size = in_size * 2 + 1;
return FALSE;
}

BYTE *pBt1 = new BYTE[in_size + 1];
memset(pBt1 , 0 , in_size+1);
memcpy(pBt1 , pBuf , in_size);

BYTE *pBt2 = pOut;
for(int i = 0 ; i < in_size ; i++)
{
if(*pBt1 == 0x00)
{
*pBt2++ = *pBt1++;
}
else if(*pBt1 == 0xa3)
{
*pBt2++ = *pBt1++;
*pBt2++ = *pBt1++;
}
else
{
*pBt2++ = 0xa3;
*pBt2++ = 0x80 + *pBt1++;
}
}
return TRUE;
}

BOOL All2Half(const BYTE *pBuf , int in_size , BYTE *pOut , int *out_size)
{
if(!pBuf)
{
return FALSE;
}
if(!pOut)
{
return FALSE;
}

if(*out_size < (in_size /2 + 1))
{
*out_size = in_size / 2 + 1;
return FALSE;
}

BYTE *pBt1 = new BYTE[in_size + 1];
memset(pBt1 , 0 , in_size+1);
memcpy(pBt1 , pBuf , in_size);

BYTE *pBt2 = pOut;
for(int i = 0 ; i < in_size ; i++)
{
if(*pBt1 == 0x00)
{
*pBt2++ = *pBt1++;
}
else if(*pBt1 == 0xa3)
{
pBt1++;
*pBt2++ = *pBt1++ - 0x80;
}
else
{
*pBt2++ = *pBt1++;
}
}
return TRUE;
}

调用如下:
BYTE b[1024];
int a = sizeof(b);
CString str6="ABCDEFGABCDEFGj;;ljkljfoiqjfad";
Half2All((const BYTE *)(LPCTSTR)str6 , str6.GetLength() , b , &a);
MessageBox((LPCTSTR)b);
或者:
BYTE b[1024];
int a = sizeof(b);
CString str6="ABCDEFGABCDEFGj;;ljkljfoiqjfad";
All2Half((const BYTE *)(LPCTSTR)str6 , str6.GetLength() , b , &a);
MessageBox((LPCTSTR)b);

wyh2002 2003-11-20
  • 打赏
  • 举报
回复
不怎么明白,我对字符编码没什么研究,谁有这方面的例子吗?
wyh2002 2003-11-19
  • 打赏
  • 举报
回复
好啊,如果你先解决的话,别忘了告诉我啊
maltt521 2003-11-19
  • 打赏
  • 举报
回复
有关你问的这个问题我也正在搜索这方面的知识,如果朋友解决的比我早的话,别忘了公布一下啊?

16,551

社区成员

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

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

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