c语言判断是否是utf8字符串,计算字符个数
#include <stdio.h>
#include <string.h>
#include <stdlib.h> /****************************************************************************
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
0000 0000-0000 007F:0xxxxxxx
0000 0080-0000 07FF:110xxxxx 10xxxxxx
0000 0800-0000 FFFF:1110xxxx 10xxxxxx 10xxxxxx
0001 0000-001F FFFF:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0020 0000-03FF FFFF:111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0400 0000-7FFF FFFF:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
**************************************************************************/ unsigned char utf8_look_for_table[] =
{
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 1, 1}; #define UTFLEN(x) utf8_look_for_table[(x)] //根据首字节,获取utf8字符所占字节数
inline int GetUtf8charByteNum(unsigned char ch)
{
int byteNum = 0; if (ch >= 0xFC && ch < 0xFE)
byteNum = 6;
else if (ch >= 0xF8)
byteNum = 5;
else if (ch >= 0xF0)
byteNum = 4;
else if (ch >= 0xE0)
byteNum = 3;
else if (ch >= 0xC0)
byteNum = 2;
else if (0 == (ch & 0x80))
byteNum = 1; return byteNum;
} //判断字符串是否是utf8格式
int IsUtf8Format(const char *str)
{
int byteNum = 0;
unsigned char ch;
const char *ptr = str; if (NULL == str)
return 0; while (*ptr != '\0')
{
ch = (unsigned char)*ptr;
if (byteNum == 0) //根据首字节特性判断该字符的字节数
{
if (0 == (byteNum = GetUtf8charByteNum(ch)))
return 0;
}
else //多字节字符,非首字节格式:10xxxxxx
{
if ((ch & 0xC0) != 0x80)
return 0;
}
byteNum--;
ptr++;
} if (byteNum > 0)
return 0; return 1;
} //计算utf8字符串字符个数
int GetUtf8Length(char *str)
{
int clen = 0;
int len = 0;
int byteNum = 0;
unsigned char ch;
char *ptr = str; if (NULL == str)
return 0; clen = strlen(str);
while (*ptr != '\0' && len < clen)
{
ch = (unsigned char)*ptr;
if (0 == (byteNum = GetUtf8charByteNum(ch)))
return 0;
ptr += byteNum;
len++;
} return len;
} int GetChargeNum(int len)
{
int num = 0; if (len > 70 && len <= 500)
{
if (!len % 67)
num = len / 67;
else
num = len / 67 + 1;
}
else if (len > 0)
num = 1; return num;
} int main(int argc, char **argv)
{
//char *str = "hello 你好呀!";
char *str;
int len = 0;
int num = 0; if (argc < 2)
return 0; str = argv[1];
printf("%s\n", str); if (!IsUtf8Format(str))
{
printf("the text is not the Format of utf8\n");
return 0;
} if (!(len = GetUtf8Length(str)))
return 0;
printf("the length of text: %d\n", len); if (!(num = GetChargeNum(len)))
return 0;
printf("the chargeNumber of sms: %d\n", num); return 1;
}
参考:
http://blog.sina.com.cn/s/blog_62b2318d0101d7kb.html
http://www.cnblogs.com/jiu0821/p/6371544.html
c语言判断是否是utf8字符串,计算字符个数的更多相关文章
- UTF-8编码的字符串拆分成单字、获取UTF-8字符串的字符个数的代码及原理
一.字符编码简介 1. ASCII码 在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(by ...
- [C++]_[获取Utf8字符串的字符个数和子字符串]
场景: 1.有时候须要统计utf8字符串的个数,单纯统计字节个数是不行的. 2.有时候也须要获取从某个位置開始的n个连续字符用于显示或计算. static int GetUtf8LetterNumbe ...
- length()返回当前字符串的字符个数
package seday01;/** * int length() * 返回当前字符串的字符个数 * @author xingsir * */public class LengthDemo { pu ...
- python统计字符串中字符个数
str = "xxx" result = {} for i in set(str):#set将字符串转为集合对象,用于去重,减少计算量 result[i] = str.count( ...
- python常见面试题讲解(二)计算字符个数
题目描述 写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数.不区分大小写. 输入描述: 第一行输入一个有字母和数字以及空格组成的字符串,第二行输入一个字 ...
- Python3基础 len函数 获得一个字符串的字符个数
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- C语言初学 使用while语句统计输入字符个数
#include<stdio.h> main() { int n=0; printf("输入任意个数的字符:\n"); while(getchar()!='\n')n+ ...
- 华为oj 计算字符个数
练手而已 #include <stdio.h> #include <string.h> int main(void) { char string[200]={'\0'}; in ...
- oracle统计字符串包含字符个数
函数:REGEXP_COUNT(); select REGEXP_COUNT('1,2,6,8,7,9',',') from dual 结果:5
随机推荐
- DirectX 读书笔记(14) Cube mapping之SkyBox[转]
http://blog.csdn.net/i_dovelemon/article/details/40481681 作者:i_dovelemon 来源:CSDN 日期:2014 / 10 / 26 主 ...
- Linux 终端 忽略大小写
忘了在哪里看到的了,记录一下. 在-/.inputrc中加入一行 set completion-ignore-case on 搞定! 这样在终端输入.补全时就忽略大小写了.当然,Linux本身还是区分 ...
- http之206状态码
206状态码, 大概就是浏览器先不下载要下载的文件,而是弹窗告诉用户,该文件是什么,有多大.由用户自行决定是否下载. 在html中,加一个a标签,a标签的地址是一个文件,就可实现该效果. 具体可参考下 ...
- centos安装yum源
网易(163)yum源是国内最好的yum源之一 ,无论是速度还是软件版本,都非常的不错,将yum源设置为163yum,可以提升软件包安装和更新的速度,同时避免一些常见软件版本无法找到.具体设置方法如下 ...
- 媒体查询ipad,pc端
媒体查询 /* 判断ipad */ @media only screen and (min-device-width : 768px) and (max-device-width : 1024px){ ...
- Python 列表的切片和连接
一.定义一个list >>> a = [1, 3, 4, 5, 'a', 's'] >>> a [1, 3, 4, 5, 'a', 's'] 二.获取列表中前3个元 ...
- Python学习笔记 - PostgreSQL的使用
一.安装PostgreSQL模块 pip install psycopg2 有时候会失败,多安装2次就好了(我是第二次成功了). 二.数据库连接接口 由于Python统一了数据库连接的接口,所以psy ...
- struts2获得需要的文件或者访问路径
在struts2中,上传文件的时候遇到一个很好用但是失效的方法,找到如下替代.并且测试了一下request可以得到的相关路径. 得到request对象: HttpServletRequest requ ...
- phonegap中使用自带浏览器打开链接
<center><a id="ssl2" href="#" onclick="window.open('http://127.0.0 ...
- 语法错误: 标识符“acosf”
1>e:\vs2010\vc\include\cmath(19): error C2061: 语法错误: 标识符“acosf” 1>e:\vs2010\vc\include\cmath(1 ...