Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2262563
  • 博文数量: 668
  • 博客积分: 10016
  • 博客等级: 上将
  • 技术积分: 8588
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-29 19:22
文章分类

全部博文(668)

文章存档

2011年(1)

2010年(2)

2009年(273)

2008年(392)

分类:

2008-05-30 09:19:00

最近看了一段中文信息处理,感觉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
阅读(363) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~