king 发表于 2008-4-27 21:14:20

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

例如:从 "ABC我cdf是" 中提取后得到 "我是"

jason 发表于 2008-4-27 22:32:55

按字节取字符,然后判断是否为中文
还要根据不同的中文编码进行处理,gb2312,unicode,utf-8等

king 发表于 2008-4-28 13:00:03

谢谢,能不能写详细些........

jason 发表于 2008-4-28 18:42:26

如果是从文件中读取字符串的话需要考虑汉字编码(gb2312,unicode,utf-8等)的处理。
如果是在C语言直接定义字符串,那么中文编码应该是GB2312或者GBK(当然也支持unicode,宽字符集包含在wchar.h头文件中)。
GBK编码汉字使用双字节保存。标准ASCII码只用到了一个字节中的7位,就可以根据此来判断是否字符数组中某个元素是否为ascii码。
关于GB2312编码的具体标准你还是你去查资料吧……我要给你把这些也全说了就可以写本书了:L

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

king 发表于 2008-4-28 21:10:32

谢谢哦,我找找资料:handshake :handshake :handshake

wqstar028 发表于 2008-5-1 00:59:57

拿GB2312来说吧:从第一个字符开始判断,如果ASCII码大于0X80,那这就是一个全角字符的一半.

leesoft 发表于 2008-5-1 19:51:25

汉字的定义是什么呢?
得先搞清除这个

king 发表于 2008-5-2 11:42:25

找到相关资料了

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

另外,WQX采用的是哪种编码标准呢?

leesoft 发表于 2008-5-3 08:32:08

gb2312

king 发表于 2008-5-3 14:58:02

谢谢:handshake

twl859588 发表于 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指向的文件中去

jason 发表于 2008-5-7 08:42:59

楼上的这样属于好心办坏事……
你写出来的他就不会再自己写了,这样你反倒害了他

leesoft 发表于 2008-5-8 22:50:42

全角符号不是汉字:L

wqstar028 发表于 2008-5-9 09:43:57

但汉字是全角符号!可以在搜索编码时将搜索范围缩小到汉字的范围,
查一下汉字区位码表,区位码表的四位编码分成两段,每段各加160,得到两个数,这两个数就是汉字的两个GB2312里的ASCII码.
假设: 某个汉字的区位码为4735,那么这个字的两个ASCII码分别是:47+160=207,35+160=195

[ 本帖最后由 wqstar028 于 2008-5-9 09:45 编辑 ]

leesoft 发表于 2008-5-9 09:55:49

汉字不是全角符号!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1

king 发表于 2008-5-9 13:13:07

谢谢 twl859588写的代码
谢谢 jason的关心

查了一下

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


[ 本帖最后由 king 于 2008-5-9 13:14 编辑 ]

king 发表于 2008-5-9 13:37:25


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


这一句不解啊。

Lendy 发表于 2008-5-9 15:48:38

全角字符的2个byte都大于0xA0。
上面这句要改成H&0xff00<0xa100才对。

twl859588 发表于 2008-5-9 22:08:18

原帖由 Lendy 于 2008-5-9 15:48 发表 http://www.emsky.net/bbs/images/common/back.gif
全角字符的2个byte都大于0xA0。
上面这句要改成H&0xff00
呵呵,似乎记错了,第一字节是汉字高位..

曾半仙 发表于 2008-5-25 19:50:06

怕死磕版

// [$81..$FE]*[$40..$7E, $80..$FE] (40..FE-7F)
function IsGBK(B1:Byte; B2:Byte): Boolean;
// AL = B1
// DL = B2
{$IFDEF PAS_VERSION}
begin
Result := (B1 in [$81..$FE]) and(B2 in [$40..$7E, $80..$FE]);
end;
{$ELSE}
asm
    add al, $7F // 0 - 81
    sub al, $7E // FE - 81 + 1
    jnb @false
    cmp dl, $7F
    je@false
    add dl, $C0 // 0 - 40
    sub dl, $BF // FE - 40 + 1
    jb@true
@false:
    xor eax, eax
    ret
@true:
    mov al, 1
end;
{$ENDIF}

[ 本帖最后由 曾半仙 于 2008-5-25 19:52 编辑 ]
页: [1] 2
查看完整版本: 求在C中将一个字符串中的汉字提取出来的算法