/*
UTF-8 valid format list:
0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
*/
char *filter_none_utf8_chars(char *src, int *len)
{
unsigned char *p;
unsigned char *pSub;
unsigned char *pStrEnd;
unsigned char *pCharEnd;
int bytes;
unsigned char *filtered;
unsigned char *pDest;
unsigned char *pInvalidCharStart; pStrEnd = (unsigned char *)src + (*len);
p = (unsigned char *)src;
pInvalidCharStart = NULL;
while (p < pStrEnd)
{
if (*p < 0x80)
{
p++;
continue;
} if ((*p & 0xE0) == 0xC0) //110xxxxx
{
bytes = ;
}
else if ((*p & 0xF0) == 0xE0) //1110xxxx
{
bytes = ;
}
else if ((*p & 0xF8) == 0xF0) //11110xxx
{
bytes = ;
}
else if ((*p & 0xFC) == 0xF8) //111110xx {
bytes = ;
}
else if ((*p & 0xFE) == 0xFC) //1111110x
{
bytes = ;
}
else
{
pInvalidCharStart = p;
break;
} p++;
pCharEnd = p + bytes;
if (pCharEnd > pStrEnd)
{
pInvalidCharStart = p - ;
break;
} for (; p<pCharEnd; p++)
{
if ((*p & 0xC0) != 0x80)
{
break;
}
} if (p != pCharEnd)
{
pInvalidCharStart = pCharEnd - (bytes + );
break;
}
} if (pInvalidCharStart == NULL) //all chars are valid
{
return src;
} filtered = (unsigned char *)malloc(sizeof(char) * (*len));
if (filtered == NULL)
{
*len = ;
*src = '\0';
return src;
} pDest = filtered;
bytes = (char *)pInvalidCharStart - src;
if (bytes > )
{
memcpy(pDest, src, bytes);
pDest += bytes;
} p = pInvalidCharStart + ; //skip this invalid char
while (p < pStrEnd)
{
if (*p < 0x80)
{
*pDest++ = *p++;
continue;
} if ((*p & 0xE0) == 0xC0) //110xxxxx
{
bytes = ;
}
else if ((*p & 0xF0) == 0xE0) //1110xxxx
{
bytes = ;
}
else if ((*p & 0xF8) == 0xF0) //11110xxx
{
bytes = ;
}
else if ((*p & 0xFC) == 0xF8) //111110xx
{
bytes = ;
}
else if ((*p & 0xFE) == 0xFC) //1111110x
{
bytes = ;
} else //invalid char
{
p++;
continue;
} pSub = p + ;
pCharEnd = pSub + bytes;
if (pCharEnd > pStrEnd)
{
p++;
continue;
} for (; pSub<pCharEnd; pSub++)
{
if ((*pSub & 0xC0) != 0x80)
{
break;
}
} if (pSub != pCharEnd)
{
p++;
continue;
} bytes += ;
memcpy(pDest, pSub-bytes, bytes);
pDest += bytes;
p += bytes;
} *len = pDest - filtered;
memcpy(src, filtered, *len);
* (src + (*len)) = '\0'; free(filtered); return src;
}

http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1230313

一个高效过滤非UTF8字符的C函数(也可用来判断是否utf8)的更多相关文章

  1. 过滤3个字节以上的utf-8字符

    /** * 过滤掉超过3个字节的UTF8字符 * @param text * @return * @throws UnsupportedEncodingException */ public stat ...

  2. Unicode其实是Latin1的扩展。只有一个低字节的Uncode字符其实就是Latin1字符——附各种字符编码表及转换表

    一.概念 1,ASCII             ASCII(American Standard Code for Information Interchange),中文名称为美国信息交换标准代码.是 ...

  3. 字符编码笔记:ASCII,Unicode和UTF-8

    很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节". 再后来,他们又做了一些可以处理 ...

  4. 字符编码笔记:ASCII,Unicode和UTF-8 转

    本文出处 http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html 只是为了记录一下省得要去搜. 今天中午,我突然想搞清楚 ...

  5. [转]字符编码笔记:ASCII,Unicode和UTF-8

    转自:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html 作者: 阮一峰 日期: 2007年10月28日 今天中午, ...

  6. 字符编码笔记:ASCII,Unicode和UTF-8(转载)

    作者: 阮一峰 日期: 2007年10月28日 今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步 ...

  7. ASCII 非打印字符

    项目出了问题,因为AscII非打印字符的原因,后来找了一下啊ASCII的非打印字符,总共有31个,然后我们直接全部替换成问号了. 解决方式为先找到非打印字符,这是我从网上找的非打印字符表: 进制 十六 ...

  8. 字符编码笔记:ASCII,Unicode和UTF-8【转载】

    作者: 阮一峰 日期: 2007年10月28日 今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步 ...

  9. 【转】字符编码笔记:ASCII,Unicode和UTF-8

    今天整理笔记,关于NSString转NSData时,什么时候使用NSUTF8StringEncoding,或者NSASCIIStringEncoding,或者 NSUnicodeStringEncod ...

随机推荐

  1. Gamma网址

    git:https://code.gammainfo.com/ 官网:http://gammainfo.com/

  2. matlab GUI之常用对话框(三)-- dialog \ errordlg \ warndlg \ helpdlg \ msgbox \questdlg

    常用的对话框(三) 1.普通对话框  dialog 调用格式: h=dialog('PropertyName','PropertyValue'......) %普通对话框 h=dialog( ]); ...

  3. TinyFox 部署在CentOS7 中测试使用

    一:TinyFox介绍 TinyFox 是一款支持OWIN标准的WEB应用的高性能的HTTP服务器,是Jexus Web Server的"姊妹篇".TinyFox本身的功能是htm ...

  4. IIS上不能播放mp4

    iis不支持mp4格式,需要手动添加. 进入iis服务管理器,打开你的网站,然后点击MIME类型---添加(扩展名:mp4   MIME类型:application/octet-stream) 如此即 ...

  5. Ubuntu14.04 64bit安装Android-Studio

    用PPA安装Android-Studio炒鸡简单,墙内亲测可用,就是速度慢了点.(睡觉时开着电脑装-) 安装Android-Studio 打开Terminal,执行: sudo add-apt-rep ...

  6. IronPython初体验和实战集合等类型转换和类型匹配

    人老了,做什么都累~学到了这么多技术,从最早C到C++再到JAVA再到C#,最终都是为了改善产品,改善系统的可维护性.众所周知C#,C++,C都是强类型语言,什么情况都得定义一些实体类来改变业务模型, ...

  7. justAP1.3.0版发布了

    justAP是一个简单的.易于使用的php运行环境,适合php开发人员使用.与wamp.xampp等不同,它仅仅包含Apache httpd和Php,这也是它名字的来由(justAP=just Apa ...

  8. IOS 特定于设备的开发:检查设备接近度和电池状态

    UIDevice类提供了一些API,使你能够跟踪设备的特征,包括电池的状态和接近度传感器.他们二者都以通知的形式提供更新,可以订阅他们,以便在有重要的更新时通知你的应用程序. 1>启动和禁用接近 ...

  9. Visual Studio 常用快捷键总结

    删除或剪切一行:  Ctrl + X 或者 Shift+Delete格式化整个文档:  Ctrl + K + D 或者 Ctrl+E+D智能感知: Ctrl + J 或者 Alt+→折叠所有方法: C ...

  10. 产品在焊接时出现异常,尤其是尺寸较大的QFP芯片,焊接后出现虚焊、冷焊、假焊等问题?

    1 不良描述 客户采用我们提供的SMT设备后,部分产品在焊接时出现异常,尤其是尺寸较大的QFP芯片,焊接后出现虚焊.冷焊.假焊等不良.应客户要求对这一批不良产品以及生产条件进行分析,以便找到改善的依据 ...