UTF-8字符切分||C语言实现
我只给出一个大概的思路,具体实现代码不方便透露
在我们切分字符时,最重要的是我们需要知道单个字符的长度,但是由于utf-8的特殊性,我们没法用一个固定的长度去切分字符,所以我们怎么知道字符的长度就显得很重要了,以下代码用于获取单个文字的字节长:
#include"stdio.h"
int main()
{ char ch,strs[12];
int byte;
ch=getchar();//取第一个字节,判断第一个字节的形式,我们就能够分析这个字符的大小,从而通过其大小去切分一个文字
if(~(int)ch <= 0)//1字节 //将二进制数按位取反,判断数的大小,通过数的大小来取文字即可完成字符的切分,这样排序是因为这样有助于代码编写
byte = 1;
else if(~(int)ch <= 4)//6字节
byte = 6;
else if(~(int)ch <= 8)//5字节
byte = 5;
else if(~(int)ch <= 16)//4字节
byte = 4;
else if(~(int)ch <= 32)//3字节
byte = 3;
else if(~(int)ch <= 64)//2字节
byte = 2;
printf("占用%d字节\n",byte);
return 0;
}
思路:由于在utf-8编码格式下单个字符的字节长度和第一个字节编码相关
因此能通过判断其值的大小来判断该文字的字节长度从而为切分文字提供方便
1个字节 0xxxxxxx 0xxxxxxx 取反是负数
2个字节 110xxxxx 10xxxxxx 110xxxxx 取反小于等于64
3个字节 1110xxxx 10xxxxxx 10xxxxxx 1110xxxx 取反小于等于32
4个字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 11110xxx 取反小于等于16
5个字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 111110xx 取反小于等于8
6个字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 1111110x 取反小于等于4
背景:
最近由于想要学着编写一点Linux的软件,在我打算装个双系统的时候,我发现怎么也打不开U盘装系统,开始我以为是我的U盘没制作好,于是我换了一个系统宠幸制作了个镜像(别问我为啥不用虚拟机,因为我最近都会在Linux环境下开发,如果都用虚拟机的话相当的不方便,所以打算将Linux作为电脑开机的首选项),但是我发现无论我怎么弄都打不开BIOS界面,我就觉得有点问题了,百度发现这是win10的原因——因为Win10都采用了全新的快速启动模式,让开机速度更快,直接跳过BIOS部分进入系统。但是在win10启动过程中按键是处于失效的状态,我觉得这是win10 的霸道条款,所以一气之下将win环境改为deepin20桌面环境,但是在编程中发现原来在win环境中的文字切分的函数失效了,因此重写了该函数。