NSSpellChecker 某些语言不起作用

NSSpellChecker certain language not working

我的 mac 版本是 10.13.4,xcode 版本是 9.4.1

我正在尝试将 NSSpellChecker 与韩语一起使用。但是无论我检查的单词是否拼错,返回的Range都是{2^63 - 1, 0}

根据对英语的快速实验,如果没有拼写错误的单词或输入的单词语言与当前拼写检查程序的语言不匹配,则返回该范围。

这就是我正在做的事情:

NSSpellChecker *checker = [NSSpellChecker sharedSpellChecker];
NSString *sampleWord = @"마직막";
NSRange range = [checker checkSpellingOfString:sampleWord, startingAt: 0];
NSLog(@"range: %@", NSStringFromRange(range));

那个 sampleWord 拼错了,但我得到了

range: {9223372036854775807, 0}

作为输出。

有人可以提供有关正在发生的事情的任何见解吗?

Edit1:当我向它输入正确的英文单词时,NSSpellChecker 指示拼写错误,这是正确的。我给韩国环境一个英文单词。所以我想 NSSpellChecker 本身工作正常,但我错过了一些关于设置的东西......?

这是我根据您的代码和评论使用的代码。

        // insert code here...
        NSSpellChecker *checker = [NSSpellChecker sharedSpellChecker];

        // NSLog ( @"Available %@", checker.availableLanguages );
        NSLog ( @"Korean %@", [checker.availableLanguages containsObject:@"ko"] ? @"YES" : @"NO" ); // Prints YES

        [checker setAutomaticallyIdentifiesLanguages:NO]; // Seems to have NO impact
        NSLog ( @"KO %@", [checker setLanguage:@"ko"] ? @"YES" : @"NO" ); // Prints YES
    
        // NSString * sampleWord = @"마직막 마직막 마직막 마직막 마직막"; // makes no difference
        NSString * sampleWord = @"마직막"; // makes no difference
        // NSString * sampleWord = @"마직막 ddd sss aaa"; // consistently prints { 4, 3 }
        // NSString * sampleWord = @"안녕하세요 햇살 가득한 남아프리카에서 왔습니다. 마직막 안녕하세요 햇살 가득한 남아프리카에서 왔습니다."; // all fine for this one also
        // NSString * sampleWord = @"안녕하세요 햇살 가녕하세득한 남녕하세아프리카에서 왔습니다. 마직막 안녕하세요 햇녕하세살 가득한 남아프리카에서 왔습니다."; // here I finally start to see some result { 45, 5 }

        NSRange range = [checker checkSpellingOfString:sampleWord
                            startingAt:0];
        NSLog(@"range: %@", NSStringFromRange(range)); // Consistently prints { NSNotFound, 0 }

        NSInteger wc;

        // Since you force the language I think this
        // is better way of checking
        range = [checker checkSpellingOfString:sampleWord
                       startingAt:0
                         language:@"ko"
                         wrap:NO
                   inSpellDocumentWithTag:0
                         wordCount:& wc];

        NSLog(@"spelling range: %@ wc %lu", NSStringFromRange(range), wc); // Consistently prints { NSNotFound, 0 } wc 1

        range = [checker checkGrammarOfString:sampleWord
                       startingAt:0
                         language:@"ko"
                         wrap:NO
                   inSpellDocumentWithTag:0
                          details:nil];

        NSLog(@"grammer range: %@ wc %lu", NSStringFromRange(range), wc); // Consistently prints { NSNotFound, 0 } wc 1

您使用 마직막 测试的单词似乎有效并且始终如一地通过 - 即使在语法测试中也是如此。

如果我创建了某种句子并通过 运行domly 粘贴字母将其弄乱,那么我开始从拼写检查器获得一些合理(且一致)的反馈。查看代码了解更多信息。

大多数情况下,我认为您应该使用允许您指定语言的消息(如代码中所示),而不是使用不允许指定语言的消息,因为您是在强制使用该语言。但我没有看到这里的不一致。如果我将单词粘贴到 Notes 中,它也不会突出显示它,尽管我故意错误的字符串也会在那里亮起。

编辑

我玩过你的代码。请注意,readline 将附加换行符,因此我通过修剪所有白色 space 和 theWord 中的换行符来更改代码,如下所示。

NSString *sampleWord = [[NSString stringWithCString:theWord encoding:NSUTF8StringEncoding] stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet];

最初我得到了你提到的差异,但就在我兴奋的时候它消失了。所以是的,这似乎不一致。我不确定拼写检查器是否变得更智能,或者控制台是否在处理输入方面变得更好。

我认为,基本问题是 getline 读取 chars。所以我也尝试了例如

            NSString *sampleWord = [[[NSString alloc] initWithBytesNoCopy:theWord
                                           length:len_read
                                         encoding:NSUTF8StringEncoding
                                     freeWhenDone:YES] stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet];

但得到了相同的结果。这里我也试了

NSASCIIStringEncoding

NSUTF16StringEncoding

但只有

NSUTF8StringEncoding

工作正常,所以看起来控制台 returns UTF8 字符串。至少对我来说,我怀疑这会根据语言环境和其他设置而有所不同。

差异

那又如何呢。昨天,当我第一次 运行 我的代码时,我认为它产生了拼写错误。再也不。我 运行 它经常出现,但再也没有出现过,我什至不确定它是否真的产生了那个错误。今天也一样。我 运行 你的代码,第一次它把这个词标记为错误,但再也没有。到现在,在运行重新生成了很多次之后,我开始怀疑我是不是弄错了,因为我根本无法再次生成它。

也许拼写检查器需要一段时间才能初始化,这导致了差异。我在手册中找不到任何指向这一点的内容。也许当我输入 Hangul 时控制台变得很聪明,这就是它生成两个单独输出的原因。也许剪贴板看到我正在复制和粘贴韩文并在某处更改了一些内容。

不过最重要的是运行我也在我的Mac书中重复了整件事,希望能再次第一次找到失败/拼错的单词,这次是复制登出。但是它从第一次开始就起作用了。

也许运行你的代码多试几次,过一会儿看看是否稳定。在这里似乎(也许)第一次将单词标记为拼错但再也没有,所以我和你现在一样困惑。

跟进

请注意,我无法让拼写检查器将单词标记为拼写错误。我还尝试了您提供的其他单词,后来甚至出现了一些乱码,但拼写检查器从未将任何内容标记为不正确。

然后我再次尝试 Mac,这次我尝试的所有内容都被(正确地)标记为不正确。因此,我的 Mac 和 Mac 书的结果不一致,尽管在它起作用的地方,根据 Apple,“마직막”似乎拼写正确。

我无法解释这一点,但怀疑它与两台机器之间的语言和区域设置差异有关,即使代码相同并且我知道没有差异。在两台机器上,输出是相同的,特别是当我初始化韩语词典时它输出 YES

这是我现在正在使用的代码,其中“마직막”失败了。

while(true) {
    char *theWord = NULL;
    size_t len = 0;
    printf("ENTER A WORD\n");
    size_t len_read = getline(&theWord, &len, stdin);
    printf("%s\n", theWord);
    
    NSString *sampleWord = [NSString stringWithCString:theWord encoding:NSUTF8StringEncoding];
    NSInteger wc;
    
    NSRange range = [checker checkSpellingOfString:sampleWord startingAt:0 language:@"ko" wrap:NO inSpellDocumentWithTag:0 wordCount:&wc];
    
    if (range.location == NSNotFound) {
        printf("Correct Spelling\n");
    } else {
        printf("Bad Spelling. Incorrect Spelling at\n");
        NSLog(@"The range: %@", NSStringFromRange(range));
    }
    fflush(stdin);
    free(theWord);
}

如果我输入“마직막”,这就是我得到的结果。

输入一个字 마직막 ㅁㅏㅈㅣㄱㅁㅏㄱ

拼写错误。拼写错误 2020-11-27 10:39:23.916315+0900 spellCheckTest[6410:124279] 范围:{0, 8}

所以我们使用相同的输入得到不同的结果。这可能是因为我如何接受来自控制台的输入??