免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4029 | 回复: 6
打印 上一主题 下一主题

C/C++语言标准库的汉字识别方案 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-02-25 01:11 |只看该作者 |倒序浏览
诸如下面的问题,诸位总是愿意自己去解析字节,鄙人认为应该让C标准库去解决这个问题,因为毕竟标准库对这个问题有标准的做法。

/*
各位,小弟有一個關於C/C++程式的問題,我想問如何把以下字串的中文字抽取出來.
"abcDEF123你好嗎HappY3",我只能把英文及數字抽出來而不能抽取中文字,謝謝.
*/

我在WINNT平台下编译执行正确。参考了ISO/IEC14882:1998(E),认定是可以跨OS平台的解决方案。但是没有在UNIX环境下的实践经验,请各位指出问题,交流经验。

#include <stdio.h>;
#include <stdlib.h>;
#include <locale.h>;

//依照ISO10646标准
bool isChinese2(wchar_t ch)
{
    return ch>;=0x2E80 && ch<=0x33FF || ch>;=0x3400 && ch<=0x4DFF
        || ch>;=0x4E00 && ch<=0x9FFF || ch>;=0xF900 && ch<=0xFAFF
        || ch>;=0xFB00 && ch<=0xFFFD;
}

int main()
{
    const char *msg="abcDEF123你好嗎HappY3";
    wchar_t buf[256],buf2[256];
    char msg2[256];
    int count=strlen(msg);
    int i=0,j=0;
    //
    setlocale( LC_ALL, ".ACP" );
    //
    mbstowcs(buf,msg,count);
    buf[count]=0;
    //
    j=0;
    while(i<count)
    {
        if(isChinese2(buf))
        {
            buf2[j++]=buf;
        }
        ++i;
    }
    buf2[j]=0;
    //
    j=wcstombs(msg2,buf2,256);
    msg2[j]='\0';
    //
    printf("=>;%s\n->;%s\n",msg,msg2);
    printf("=:%S\n-:%S\n",buf,buf2);
    return 0;
}

输出: :em11:
=>;abcDEF123你好嗎HappY3
->;你好嗎
=:abcDEF123你好嗎HappY3
-:你好嗎

论坛徽章:
0
2 [报告]
发表于 2004-02-25 08:42 |只看该作者

C/C++语言标准库的汉字识别方案

setlocale( LC_ALL, ".ACP" );
Sets the locale to the ANSI code page obtained from the operating system.
在unix中没有这个选项吧

论坛徽章:
0
3 [报告]
发表于 2004-02-25 09:05 |只看该作者

C/C++语言标准库的汉字识别方案

[quote]原帖由 "improgrammer"][/quote 发表:


支持一下.

起初, 在我的 xterm 中不好使(redhat AS 7.2, gnome), 研究了半天, 发现:


  1. setlocale (LC_ALL, ".ACP");
复制代码


要换为

  1. setlocale (LC_ALL, "zh_CN");
复制代码


你能把代码给大家解释一下吗?

论坛徽章:
0
4 [报告]
发表于 2004-02-25 09:33 |只看该作者

C/C++语言标准库的汉字识别方案

可惜在sco unix 中没有zh_CN,用了支持的所有的lang都不行。

论坛徽章:
0
5 [报告]
发表于 2004-02-25 10:09 |只看该作者

C/C++语言标准库的汉字识别方案

謝謝各位把我昨天所問的問題又找出一個新而較詳細的解答,真是謝謝啦.
在linux內,系統的語言是較locale來實現的,所以只要把你當時語言的環境設定好為zh_TW.CN2312 or zh_TW.Big5就可以做到繁體,簡體的語言環境了.
thanks.

improgrammer:
你所用的是unicode的取字方法,對嗎? Thanks.

论坛徽章:
0
6 [报告]
发表于 2004-02-25 11:33 |只看该作者

C/C++语言标准库的汉字识别方案

To li2002 win_hate 惠繪洋:

MBCS到的解析属于底层的机制,既然OS和C库已经把这个问题包装起来了,我们就不应当再去做一部解决同一个问题的手推车,破坏接口的统一性。这是我的理解。看来UNIX环境也支持这个思想。

看来还是用繁体字的侠客对这个问题感触较深,讲出了操作系统设定locale的原理——只要给OS装上中文环境并设定中文为系统语言,系统就具有正确解析中文字符的能力。这就是用".ACP"的道理。当然,应用程序是否应该绑定在系统语言上,则是另外一个问题。若是指定zh_TW,则软件移到日本就没法用了。

在软件面向世界的背景下,怎么办才是彻底解决问题,望各位继续交流经验,小弟这里抛砖引玉了。

论坛徽章:
0
7 [报告]
发表于 2004-02-26 17:57 |只看该作者

C/C++语言标准库的汉字识别方案

MBCS在unix下是支持的,但在scounix下的中文龙马装上后确没有zhcn语言选项
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP