求在C中将一个字符串中的汉字提取出来的算法
例如:从 "ABC我cdf是" 中提取后得到 "我是" 按字节取字符,然后判断是否为中文还要根据不同的中文编码进行处理,gb2312,unicode,utf-8等 谢谢,能不能写详细些........ 如果是从文件中读取字符串的话需要考虑汉字编码(gb2312,unicode,utf-8等)的处理。
如果是在C语言直接定义字符串,那么中文编码应该是GB2312或者GBK(当然也支持unicode,宽字符集包含在wchar.h头文件中)。
GBK编码汉字使用双字节保存。标准ASCII码只用到了一个字节中的7位,就可以根据此来判断是否字符数组中某个元素是否为ascii码。
关于GB2312编码的具体标准你还是你去查资料吧……我要给你把这些也全说了就可以写本书了:L
补充,我说的不一定对。要鄙视的人们尽管来吧,哦也~ 谢谢哦,我找找资料:handshake :handshake :handshake 拿GB2312来说吧:从第一个字符开始判断,如果ASCII码大于0X80,那这就是一个全角字符的一半. 汉字的定义是什么呢?
得先搞清除这个 找到相关资料了
http://baike.baidu.com/view/1250144.html
另外,WQX采用的是哪种编码标准呢? gb2312 谢谢:handshake 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指向的文件中去 楼上的这样属于好心办坏事……
你写出来的他就不会再自己写了,这样你反倒害了他 全角符号不是汉字:L 但汉字是全角符号!可以在搜索编码时将搜索范围缩小到汉字的范围,
查一下汉字区位码表,区位码表的四位编码分成两段,每段各加160,得到两个数,这两个数就是汉字的两个GB2312里的ASCII码.
假设: 某个汉字的区位码为4735,那么这个字的两个ASCII码分别是:47+160=207,35+160=195
[ 本帖最后由 wqstar028 于 2008-5-9 09:45 编辑 ] 汉字不是全角符号!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1 谢谢 twl859588写的代码
谢谢 jason的关心
查了一下
汉字字符和规定了全角的英文字符及国标GB2312-80中的图形符号和特殊字符都是全角字符。一般的系统命令是不用全角字符的,只是在作文字处理时才会使用全角字符。
[ 本帖最后由 king 于 2008-5-9 13:14 编辑 ]
else if((H&0x00ff)<0x00a1) {fseek(fi,-1,1);}
这一句不解啊。 全角字符的2个byte都大于0xA0。
上面这句要改成H&0xff00<0xa100才对。 原帖由 Lendy 于 2008-5-9 15:48 发表 http://www.emsky.net/bbs/images/common/back.gif
全角字符的2个byte都大于0xA0。
上面这句要改成H&0xff00
呵呵,似乎记错了,第一字节是汉字高位..
怕死磕版
// [$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