最近看了一段中文信息处理,感觉utf8的编码非常有意思,学习了一番,编写了一个小程序,
下面是总结。
UTF -8是UNICODE的一种变长字符编码,由Ken Thompson于1992年创建。
现在已经标准化为RFC 3629。
UTF-8用1到6个字节编码UNICODE字符。
UFT-8转换表表示如下:
UNICODE UTF-8
00000000 - 0000007F 0xxxxxxx
00000080 - 000007FF 110xxxxx 10xxxxxx
00000800 - 0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
00010000 - 001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
00200000 - 03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
04000000 - 7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
若用一个字节表示,第一个字节的高位为0,
若用两个字节表示,第一个字节的高位为110
若用三个字节表示,第一个字节的高位为1110,
其他类推,
这样保证不互相干扰,
第二个字节,第三个字节,。。。。都是10开头,
只要找到第一个字节,就能找到第二个字节
即使其中有错误,可能一个字符有问题,其他没事,感觉太神奇了。
Thompson不仅发明了UNIX操作系统,还发明了UTF-8(UniCode)字符集,并开创了多种语言。
Kenneth Thompson于1943年2月4日出生于美国New Orleans, Louisiana。
Ken分别于1965年,1966年在加州大学Berkeley分校获得其EECS的学士和硕士学位。
1969年,Thompson与Dennis Ritchie共同实现了UNIX操作系统。
Thompson并且发明了B语言。B语言是后来Dennis Ritchie的C语言的前身。
Thompson还写了Bon编程语言。另外,UNIX下的编辑器ed也是Thompson发明与实现的。
与Rob Pike一起,Thompson也是Plan 9操作系统的主要贡献者。
在Plan 9的工作中,Thompson发明了UTF-8(UniCode)字符集。
Thomposon于2000年从贝尔实验室退休。
目前Thompson加入了Entrisphere Inc. ( )并出任其院士一职。
Dennis Ritchie和Ken Thompson1983年被授予图灵奖以表彰 其在通用操作系统理论领域的贡献,
特别是Unix操作系统的开发与实现。
什么时候才能成为像Kenneth Thompson这样的大师
我们网站,我发现行字符太长的话,容易变形,我编的这个一个小程序也许能派上用途,
可以把指定文本的行字数 ,把字数太长的行变短,
语言编码只支持utf8,汉字在utf8编码占用3个字节,
基本思路
读出linenumber数量个数据,输出linenumber数量数据加上\n,utf8是变长,读出多少需要计算,
之后循环直到没有了数据。
下面是源码:
utf8.c
#include
#include /* 和exit相关 */
#include
#include
#define linenumber 49 /*表示一行多少个字符*/
int main(int argc,char *argv[])
{
FILE *fsource,*ftarget;
char buf[linenumber*3]={0};
char temp;
int i=0;
int count=0;
int t; /*表示剩余多少字节*/
if(argc<3)
{
printf("Argument number error.");
exit(1);
}
if((fsource=fopen(argv[1],"rb"))==NULL)
{
printf("Can't open %s",argv[1]);
exit(1);
}
if((ftarget=fopen(argv[2],"wb"))==NULL)
{
printf("Cant open %s",argv[2]);
}
while(fread(buf+i,1,1,fsource)==1) /*循环*/
{
temp=buf[i];
i++;
t--;
if((temp&0x80)==0x00) /*单字节*/
{
count++;
t=0;
}
if((temp&0xe0)==0xc0) /*双字节*/
{
count++;
t=1;
}
if((temp&0xf0)==0xe0) /*三字节,汉字使用三字节*/
{
count++;
t=2;
printf("hello chinese. ");
}
if((temp&0xf8)==0xf0) /*四字节*/
{
count++;
t=3;
}
if((temp&0xfc)==0xf8) /*五字节*/
{
count++;
t=4;
}
if((temp&0xfe)==0xfc) /*六字节*/
{
count++;
t=5;
}
printf("%d ",count);
if(count>linenumber&&t==0)
{
fwrite(buf,1,i,ftarget);
fwrite("\n",1,1,ftarget);
for(i=0;i buf[i]=0;
i=0;
count=0;
}
}
if(fclose(fsource)==EOF)
{
printf("Can't close file %s.\n",argv[1]);
exit(1);
}
if(fclose(ftarget)==EOF)
{
printf("Can't close file %s.\n",argv[2]);
exit(1);
}
printf("success!\n");
exit(0);
}
编译
gcc -o utf8 utf8.c
处理文本,用如下命令,file1为原文本,file2为生成文本
./utf8 file1 file2
阅读(375) | 评论(0) | 转发(0) |