处理字符串中的6字节乱码汉字 C3 XX C2 XX C2 XX

开发邮件或其他APP时,会发现有的UTF8汉字(3字节)被组合添加了3个字节(C3 C2 C2),在OC代码中需要去除。


//处理字符串中的6字节乱码汉字 C3 XX C2 XX C2 XX
void resolveHZcode(char *orgstr, char *newstr)
{
    int j=0;
    int needDeal = 0; //0, 0x40, 0xff
    int nearestC3 = 0; //为了确保处理C2时是紧接着C3后面的汉字,而非其他C2编码字符(如C2 A0代表无中断空格,不应转换)
    //注意,有时候一些繁体汉字造成乱码问题,可能出现C3 XX C2 XX C2 XX C2 XX,因此本项目暂时仅考虑最多8字节的情况
    for (int i=0;i<strlen(orgstr);i++)
    {
        unsigned char c = (unsigned char)orgstr[i];

        if(needDeal == 0x40)    // C3后面的字节,添加0x40
        {
            newstr[j] = c + 0x40;
            j++;

            needDeal = 0;
            continue;
        }
        if(needDeal == 0xff)    // C2后面的字节,直接接续
        {
            newstr[j] = c;
            j++;

            needDeal = 0;
            continue;
        }

        if(c == 0xc3)
        {
            needDeal = 0x40;
            nearestC3 = i+1; //+1是为了防止字符串第一个字节就是C3造成误判
            continue;
        }
        if(c == 0xc2)
        {
            if((nearestC3-1 + 2 == i) || (nearestC3-1 + 4 == i) || (nearestC3-1 + 6 == i)) //为了确保处理C2时是紧接着C3后面的汉字.
            {
                needDeal = 0xff;
                continue;
            }
        }

        if(nearestC3 > 0)
        {
            if(nearestC3-1 + 2 == i) //如果C3 XX 后面没有跟C2,说明汉字不完整,删除先前的1字节内容
            {
                j--;
            }
            if(nearestC3-1 + 4 == i) //如果C3 XX C2 XX 后面没有跟C2,说明汉字不完整,删除先前2字节内容
            {
                j -= 2;
            }
        }
        nearestC3 = 0;

        newstr[j] = c;
        j++;
    }
    newstr[j] = 0;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值