开发邮件或其他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;
}
本文介绍了一种处理UTF8编码下出现特定乱码(C3C2C2)问题的方法,通过C语言实现,旨在帮助开发者解决在开发邮件客户端等应用过程中遇到的乱码问题。
2952

被折叠的 条评论
为什么被折叠?



