如何统计汉字的字数?

WSDN 发布于 2013/08/21 10:35
阅读 1K+
收藏 1

我想统计: 什么样的问题在 oschina 算是一个好问题? 这个句子里面以oschina为分割总共有三部分:

什么样的问题在+ oschina +算是一个好问题?

现在想知道oschina前面有几个汉字?oschina有几个英文?oschina后面有几个汉字?不要直接去查找oschina字符串去计算啊,可以当作oschina是某个未知的英文单词,如何统计出来呢?

三部分都要统计出来呢?作为我们人的话很容易知道:前面是7个汉字,中间有一个空格 然后7个字母 然后7个汉字加一个问号,计算机如何做出这样的答案来? 

ps.楼下的说我的表达能力有问题,看来我确实没有表达清楚:)再补充一下问题。

加载中
0
TestCrack
TestCrack

说的楼主二一点,就是不会数汉字。

说的楼主牛逼点,就是不会表达,TMD用什么语言统计啊。

WSDN
WSDN
问题是如何数?求解法~~
0
小鱼er儿

简单只是解决给定的定符串

    @Test
    public void t2() {
        String str = "什么样的问题在 oschina 算是一个好问题? ";
        str = str.replaceAll(" ", "");//可以多加些正则去除不需要的
        int zhlen = 0;
        int enlen = 0;
        int len = 0;
        char[] attr = str.toCharArray();
        for (int i = 0; i < attr.length; i++) {
            char c = attr[i];
            Character character = new Character(c);
            System.out.println(character.charValue() + "==" + character.toString().getBytes().length);
            len = character.toString().getBytes().length;
            if(len ==2){
                zhlen++;
            }
            if(len ==1){
                enlen++;
            }
        }
        
        System.out.println(zhlen);
        System.out.println(enlen);
    }

WSDN
WSDN
三部分都要统计出来呢?作为我们人的话很容易知道前面是7个汉字,中间有一个空格 然后7个字母 然后7个汉字加一个问号,计算机如何做出这样的答案来?
0
Yu_Yang
Yu_Yang

统计Unicode, 先根据编码转换为unicode,然后len,如果想去掉英文只统计汉字,那么我给你提供一个思路:汉字在unicode中是有一个范围的,你把不在这个范围的unicode排除就好了,给你一段示例代码:

unicode_str = s.decode('utf8')
sum(1 for ss in unicode_str if test_chinese(ss))
decode后面自己根据情况修改,如果已经是unicode,那么这一行去掉,test_chinese这个函数自己编写,如果是中文字符就返回True,应该比较简单

Yu_Yang
Yu_Yang
这很简单啊,用正则匹配中间的英文单词,然后将这个字符串切分为两部分就好.
WSDN
WSDN
回复 @Yu_Yang : 补充问题了~~
Yu_Yang
Yu_Yang
回复 @忘我 : 你的表达能力有问题,什么前面,什么后面,你提到的那个问题全部是汉字好不好?怎么判断前面,后面?
WSDN
WSDN
我想统计oschina后面是几个汉字呢?
0
ueharaai
ueharaai
查看gb2312,unicode,utf8编码规则。
WSDN
WSDN
嗯 在研究,问题是算法和思路。
0
泡不烂的凉粉
泡不烂的凉粉

utf8编码说的很详细,  排除掉 10开头的字节,剩余的都字节数就是字数. 

其他编码 简单的处理就是转换成 utf8编码来干.

0
lock_free
lock_free

用正则将中文替换掉-数字母。

用正则将数字替换掉-数汉字。

如果有其他字母,可做相似处理。

0
FreeBlues
FreeBlues

CL-USER> (defparameter *字符串*  "什么样的问题在 oschina 算是一个好问题?")
*字符串*
CL-USER> 
CL-USER> (dotimes (序数 (length *字符串*)) 
            (print (char-code (elt *字符串* 序数))))
       
20160  
20040  
26679  
30340  
38382  
39064  
22312  
32  
111  
115  
99  
104  
105  
110  
97  
32  
31639  
26159  
19968  
20010  
22909  
38382  
39064  
65311  
NIL 
CL-USER> 

这么写一下估计你就明白怎么去统计了, 0~127的是英文字母, 32是空格, 65311是全角问号

FreeBlues
FreeBlues
回复 @忘我 : Common Lisp , 处理起字符串来应该比较简单.
WSDN
WSDN
研究研究~~你的这是什么程序的代码? 会不会输入日文出错?
0
FreeBlues
FreeBlues

发现一条更简单的语句:

CL-USER> (map 'vector #'char-code *字符串*)
#(20160 20040 26679 30340 38382 39064 22312 32 111 115 99 104 105 110 97 32 31639 26159 19968 20010 22909 38382 39064 65311)
CL-USER> 

ietn
ietn
回复 @Yu_Yang : 我支持你
Yu_Yang
Yu_Yang
回复 @FreeBlues : 我对lisp没有任何成见, 我是一个lisp粉丝,我用了emacs 3年,也写了很多elisp与scheme代码.但我的经验表明让一个没接触过lisp的人理解lisp并不容易,一个S-expression就足够把人搞晕,社区氛围是很重要的,你去过国外的社区看看,不尊重社区氛围,人家压根不鸟你.说了这么多我的意思只有一个:你应该用一种能被社区中大多数人理解的方式来交流
FreeBlues
FreeBlues
回复 @Yu_Yang : 你这个说法也太搞笑了吧, 这里是开源社区, 难道还限制语言使用? Clisp居然还跟这里的氛围明显不符? 这仅仅是你一个人的看法吧. 如果你认真看了我的两次回复, 你就不会得出我压根没有考虑提问者是否理解这个结论了. 我第一次回复的代码已经相当于详细的具体解决问题思路的伪码了, 第二次给出一个比较简短的形式, 那是希望能引起提问者对Lisp 这种简洁表达的兴趣.
Yu_Yang
Yu_Yang
回复 @FreeBlues : 这个社区还不偏工程? 你看看讨论的话题,全都是些框架,语言技巧等等,clisp明显和这种氛围不符,不管怎么说,clisp都不是工程领域的主流语言,你用这种语言回答问题,压根就没考虑提问者看不看得懂,看不懂的回答对提问者是没有价值的
FreeBlues
FreeBlues
回复 @Yu_Yang : 没觉得这里如何偏工程了, 况且 Common Lisp 也并非是一种被限定应用领域的语言, 而且我在这里的博客主要就是写一些学习 Common Lisp 的心得.
下一页
0
戴威
戴威
你首先确定一下编码
0
FreeBlues
FreeBlues
回复 @Yu_Yang : 那我只能说你关于社区氛围以及 Lisp 的观点有些太过狭隘了, 还说对 Lisp 没有成见, 我看你对 Lisp 的观点就是最大的成见,  提问者提出问题后很多时候需要他们自己进一步的思考和学习, C代码就不需要他进一步思考了? S-表达式说到底就是一个前缀表达, 其实我的第一段代码哪怕是根本看不懂Lisp代码的人也能理解: 先把所有的文字字符变成其数字编码值, (具体怎么转换取决于实际情况,只不过我用了Lisp函数而已), 然后再对这些数字进行处理. 你为什么要下意识地贬低提问者的理解能力呢?


再说说你对社区氛围的曲解, 我没记错的话这里的名字是开源中国社区, 是一个没有硬性限定的技术性论坛, 起码我在这里看到关于各种技术的开放性讨论(包括开源硬件甚至有Cocoa), 我感觉反而是你在不尊重这种社区氛围, 非要限定某种范围, 有这个必要吗? 觉得你挺可笑的. 还"你应该如何如何', 我倒是觉得你应该避免这种自以为是的性格了.
FreeBlues
FreeBlues
@Yu_Yang 不说了, 真是无聊啊...浪费这么半天功夫, 相信你最初是善意的好了, 不过如果智慧值还没达到溢出的程度最好不要乱玩幽默...
Yu_Yang
Yu_Yang
回复 @FreeBlues : 你这人真是一点幽默感都没有,我的原话是"有人会骂你装逼", 而且你看后面还跟了一个:) , :)是笑脸的意思你难道不懂?
FreeBlues
FreeBlues
@Yu_Yang 呵呵, 原来装逼不是人身攻击? 没人鸟你也不是人身攻击? 这是神马呢? 双重标准还是啥的... 再次呵呵一下!4
Yu_Yang
Yu_Yang
我的妈呀, 都快上升到人身攻击的程度了,得得得,我怕了,我错了,其实不过是想给个建议而已
返回顶部
顶部