NSPellChecker某些语言不起作用



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

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

根据对英语的快速实验,当没有拼写错误的单词时,或者如果输入的单词语言与当前拼写检查器的语言不匹配,就会返回Range。

这就是我正在做的:

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

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

range: {9223372036854775807, 0}

作为输出。

有人能对正在发生的事情提供任何见解吗?

第1版:当我把正确的英语单词扔给它时,NSPellChecker表示拼写错误,这是正确的。我给了韩国环境一个英语单词。所以我想NSPellChecker本身工作正常,但我错过了一些关于设置的东西。。?

以下是我根据您的代码和注释使用的代码。

// 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

您正在用测试的单词마직막似乎是有效的,并且一致通过——即使在语法测试中也是如此。

如果我创建了某种句子,并通过随机粘贴字母将其搞砸,那么我就会开始从拼写检查器那里得到一些合理(一致)的反馈。有关详细信息,请参阅代码。

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

编辑

我已经玩过你的代码了。注意,readline将附加换行符,因此我通过从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

工作正常,所以控制台似乎返回了UTF8字符串。至少对我来说,我怀疑这会因地区和其他设置而有所不同。

差异

那又怎样呢。昨天,当我第一次运行代码时,我认为它产生了拼写错误。再也不会了。我跑了很多次,但再也没有跑过,我甚至不确定它是否真的产生了那个错误。今天也是。我运行了你的代码,第一次它把这个词标记为错误,但再也没有了。到目前为止,在再次运行它多次之后,我开始怀疑我是否错了,因为我根本无法再次生成它。

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

不过,奇怪的是,我也在MacBook上重复了整个过程,希望第一次能再次得到失败/拼写错误的单词,这次是复制日志。但在那里,它从第一次就起了作用。

也许运行您的代码几次,看看它是否在一段时间后稳定下来。在这里,它似乎(也许)第一次把这个词标记为拼写错误,但再也没有了,所以我现在和你一样困惑。

跟踪

请注意,我无法让拼写检查器将单词标记为拼写错误。我也试过你说的其他单词,后来甚至有些胡言乱语,但拼写检查器从未将任何错误标记为错误。

然后我再次在Mac上尝试,这次我尝试的所有内容都被标记为(正确)不正确。因此,我的Mac和Macbook的结果并不一致,尽管在它工作的地方,似乎";마직막"根据苹果公司的说法拼写正确。

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

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

while(true) {
char *theWord = NULL;
size_t len = 0;
printf("ENTER A WORDn");
size_t len_read = getline(&theWord, &len, stdin);
printf("%sn", 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 Spellingn");
} else {
printf("Bad Spelling. Incorrect Spelling atn");
NSLog(@"The range: %@", NSStringFromRange(range));
}
fflush(stdin);
free(theWord);
}

如果我输入";마직막&";,这就是我得到的。

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

拼写错误。拼写错误2020-11-27 10:39:23.916315+0900拼写检查测试[6410:12479]范围:{0,8}

因此,使用相同的输入,我们会得到不同的结果。这可能是因为我接受控制台输入的方式吗??

最新更新