易码技术论坛

 找回密码
 加入易码
搜索
查看: 3530|回复: 23

[求助] 求在C中将一个字符串中的汉字提取出来的算法

[复制链接]
发表于 2008-4-27 21:14:20 | 显示全部楼层 |阅读模式
例如:从 "ABC我cdf是" 中提取后得到 "我是"
发表于 2008-4-27 22:32:55 | 显示全部楼层
按字节取字符,然后判断是否为中文
还要根据不同的中文编码进行处理,gb2312,unicode,utf-8等
 楼主| 发表于 2008-4-28 13:00:03 | 显示全部楼层
谢谢,能不能写详细些........
发表于 2008-4-28 18:42:26 | 显示全部楼层
如果是从文件中读取字符串的话需要考虑汉字编码(gb2312,unicode,utf-8等)的处理。
如果是在C语言直接定义字符串,那么中文编码应该是GB2312或者GBK(当然也支持unicode,宽字符集包含在wchar.h头文件中)。
GBK编码汉字使用双字节保存。标准ASCII码只用到了一个字节中的7位,就可以根据此来判断是否字符数组中某个元素是否为ascii码。
关于GB2312编码的具体标准你还是你去查资料吧……我要给你把这些也全说了就可以写本书了

补充,我说的不一定对。要鄙视的人们尽管来吧,哦也~

评分

参与人数 1小红花 +3 收起 理由
king + 3 好,支持

查看全部评分

 楼主| 发表于 2008-4-28 21:10:32 | 显示全部楼层
谢谢哦,我找找资料
发表于 2008-5-1 00:59:57 | 显示全部楼层
拿GB2312来说吧:从第一个字符开始判断,如果ASCII码大于0X80,那这就是一个全角字符的一半.
发表于 2008-5-1 19:51:25 | 显示全部楼层
汉字的定义是什么呢?
得先搞清除这个
 楼主| 发表于 2008-5-2 11:42:25 | 显示全部楼层
找到相关资料了

http://baike.baidu.com/view/1250144.html

另外,WQX采用的是哪种编码标准呢?
发表于 2008-5-3 08:32:08 | 显示全部楼层
gb2312
 楼主| 发表于 2008-5-3 14:58:02 | 显示全部楼层
谢谢
发表于 2008-5-7 00:12:43 | 显示全部楼层
void check(char *si,char *so)

{

        int H;

        FILE *fi,*fo;

        fi=fopen(si,"r");

        fo=fopen(so,"w");

        while(!feof(fi))

        {

                fread(&H,2,1,fi);

                if((H&0x00ff)>=0x00b0&&(H&0x00ff)<=0x00f7&&(H&0xff00)>=0xa100)

                        {

                        fwrite(&H,2,1,fo);

                        }

                else if((H&0x00ff)<0x00a1) {fseek(fi,-1,1);}

                else continue;

        }

        fclose(fo);

        fclose(fi);

}

功能是从si指向的文件中筛选出所有gb2312编码的汉子输出到so指向的文件中去
发表于 2008-5-7 08:42:59 | 显示全部楼层
楼上的这样属于好心办坏事……
你写出来的他就不会再自己写了,这样你反倒害了他
发表于 2008-5-8 22:50:42 | 显示全部楼层
全角符号不是汉字
发表于 2008-5-9 09:43:57 | 显示全部楼层
但汉字是全角符号!可以在搜索编码时将搜索范围缩小到汉字的范围,
查一下汉字区位码表,区位码表的四位编码分成两段,每段各加160,得到两个数,这两个数就是汉字的两个GB2312里的ASCII码.
假设: 某个汉字的区位码为4735,那么这个字的两个ASCII码分别是:47+160=207,35+160=195

[ 本帖最后由 wqstar028 于 2008-5-9 09:45 编辑 ]
发表于 2008-5-9 09:55:49 | 显示全部楼层
汉字不是全角符号!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
 楼主| 发表于 2008-5-9 13:13:07 | 显示全部楼层
谢谢 twl859588写的代码
谢谢 jason的关心

查了一下
汉字字符和规定了全角的英文字符及国标GB2312-80中的图形符号和特殊字符都是全角字符。一般的系统命令是不用全角字符的,只是在作文字处理时才会使用全角字符。

[ 本帖最后由 king 于 2008-5-9 13:14 编辑 ]
 楼主| 发表于 2008-5-9 13:37:25 | 显示全部楼层
                else if((H&0x00ff)<0x00a1) {fseek(fi,-1,1);}


这一句不解啊。
发表于 2008-5-9 15:48:38 | 显示全部楼层
全角字符的2个byte都大于0xA0。
上面这句要改成H&0xff00<0xa100才对。
发表于 2008-5-9 22:08:18 | 显示全部楼层
原帖由 Lendy 于 2008-5-9 15:48 发表
全角字符的2个byte都大于0xA0。
上面这句要改成H&0xff00

呵呵,似乎记错了,第一字节是汉字高位..
发表于 2008-5-25 19:50:06 | 显示全部楼层

怕死磕版

  1. // [$81..$FE]*[$40..$7E, $80..$FE] (40..FE-7F)
  2. function IsGBK(B1:Byte; B2:Byte): Boolean;
  3. // AL = B1
  4. // DL = B2
  5. {$IFDEF PAS_VERSION}
  6. begin
  7.   Result := (B1 in [$81..$FE]) and  (B2 in [$40..$7E, $80..$FE]);
  8. end;
  9. {$ELSE}
  10. asm
  11.     add al, $7F // 0 - 81
  12.     sub al, $7E // FE - 81 + 1
  13.     jnb @false
  14.     cmp dl, $7F
  15.     je  @false
  16.     add dl, $C0 // 0 - 40
  17.     sub dl, $BF // FE - 40 + 1
  18.     jb  @true
  19. @false:
  20.     xor eax, eax
  21.     ret
  22. @true:
  23.     mov al, 1
  24. end;
  25. {$ENDIF}
复制代码

[ 本帖最后由 曾半仙 于 2008-5-25 19:52 编辑 ]
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-11-1 09:04 , Processed in 0.013405 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表