Iphone 计算NSString中的字数

Iphone 计算NSString中的字数,iphone,ipad,nsstring,count,uitextview,Iphone,Ipad,Nsstring,Count,Uitextview,我正在尝试为使用UITextView的应用程序实现一个单词计数功能 英语中两个单词之间有一个空格,所以计算一个英语句子中的单词数量非常容易。 中文和日文的字数计算会出现问题,因为通常整个句子中没有空格 我检查了iPad上三种不同的文本编辑器,它们都有字数统计功能,并将它们与MS word进行了比较 例如,这里有一系列日语字符,表示世界的理念:世界(世界)の(s)アイデア(想法) 世界のアイデア 1) iPad和MS word的页面将每个字符计算为一个单词,因此包含7个单词 2) iPad文本编辑

我正在尝试为使用UITextView的应用程序实现一个单词计数功能

英语中两个单词之间有一个空格,所以计算一个英语句子中的单词数量非常容易。 中文和日文的字数计算会出现问题,因为通常整个句子中没有空格

我检查了iPad上三种不同的文本编辑器,它们都有字数统计功能,并将它们与MS word进行了比较

例如,这里有一系列日语字符,表示世界的理念:世界(世界)の(s)アイデア(想法)

世界のアイデア

1) iPad和MS word的页面将每个字符计算为一个单词,因此包含7个单词

2) iPad文本编辑器p***将整个文本计算为一个单词-->他们只是用空格分隔单词

3) iPad文本编辑器i***将其计算为三个单词-->我相信他们将CFStringTokenizer与kCFStringTokenizerUnitWord一起使用,因为我可以得到相同的结果)

我在互联网上做过研究,网页和MS word的字数计算似乎是正确的,因为每个汉字都有一个意思

我找不到像Pages或MS Word这样的计算单词的类,而且很难从头开始实现,因为除了日语和汉语,iPad还支持很多不同的外语。

我认为带有kCFStringTokenizerUnitWord的CFStringTokenizer是最好的选择

有没有办法计算NSString中的单词,比如页面和MSWords?


谢谢

如果您的字符串不包含标识分词的标记(如空格),这将是一个非常困难的问题。我知道,从尝试解决字谜中得到的一种方法是:

在字符串的开头,以一个字符开头。这是一个词吗?它可以是像“a”这样的词,也可以是像“a”或“模拟”这样的词的一部分。因此,关于单词是什么的决定必须考虑所有的字符串。你会考虑下一个字符,看看你是否可以从第一个单词后面跟着你所找到的第一个单词开始另一个单词。如果你决定这个词是“A”,而剩下的是“NALOG”,那么你很快就会发现已经找不到更多的词了。当你开始在字典中查找单词(见下文)时,你就知道你正在做出正确的选择,在哪里破译单词。当你停止找单词时,你知道你做了一个错误的选择,你需要回溯

其中很大一部分是有足够的字典来包含你可能遇到的任何单词。英语资源将是TWL06或SOWPODS或其他拼字词典,其中包含许多晦涩难懂的单词。要做到这一点,您需要大量内存,因为如果您根据包含所有可能单词的简单数组检查单词,您的程序将运行得非常慢。如果解析词典,将其作为plist持久化并重新创建词典,那么您的检查将足够快,但它需要更多的磁盘空间和内存空间。其中一个大型拼字词典可以扩展到大约10MB,实际单词作为键,简单的NSNumber作为值的占位符-您不关心值是什么,只关心字典中存在键,它告诉您该单词是有效的

如果在计数时维护一个数组,则在添加包含最后字符的最后一个单词时,您可以以胜利的方式执行[array count],但也有一种简单的回溯方法。如果在某个时候您停止查找有效的单词,您可以从数组中弹出最后一个对象,并将其替换为字符串的开头,然后开始查找其他单词。如果这不能让你回到正确的轨道上,那就换一个词

我将继续进行实验,在解析字符串时查找可能的三个单词——当您识别出三个可能的单词后,将第一个单词拿走,存储在数组中,然后查找另一个单词。如果你发现这样做太慢了,而且考虑到前面只有两个词,你得到的结果还可以,那么就把它改为两个。如果你发现你用单词分词策略增加了很多死角,那么增加前面考虑的单词数。 另一种方法是使用自然语言规则——例如,“A”和“NALOG”可能看起来没问题,因为辅音跟在“A”后面,但“A”和“ARDVARK”将被排除,因为元音开头的单词跟在“AN”后面,而不是“A”后面是正确的。这可能会变得很复杂,就像你想做的那样-我不知道这在日语中是否变得更简单,但肯定有像“ma-su”这样的常见动词结尾


(编辑:开始悬赏,如果不是我的方式,我想知道最好的方式。)

只需使用长度法:

[@"世界のアイデア" length];  // is 7
话虽如此,作为一个说日语的人,我认为3是正确的答案

我认为带有kCFStringTokenizerUnitWord的CFStringTokenizer是最好的选择


没错,您必须遍历文本,只需计算途中输入的单词标记数

我建议继续使用
CFStringTokenizer
。因为它的平台特性,所以会通过平台升级来升级。苹果公司的许多人都在努力反映真正的文化差异。对于普通开发人员来说,这是很难知道的

这很难,因为这本质上不是一个编程问题。这是一个人类文化的语言问题。每种文化都需要一位人类语言专家。对于日本人,你需要日本文化专家。然而,我不认为日本人需要认真的字数统计功能,因为我听说,在日本文化中,单词本身的概念并不那么重要。你们应该首先定义单词的概念

我不明白你为什么要把字数的概念强加给字符数。你说的汉字
__block int count = 0;
[string enumerateSubstringsInRange:range
                           options:NSStringEnumerationByWords
                        usingBlock:^(NSString *word,
                                     NSRange wordRange,
                                     NSRange enclosingRange,
                                     BOOL *stop)
    {
        count++;
    }
];