2

我正在尝试使用CFStringTokenizerCopyBestStringLanguage. 文档说:

用于测试的字符串范围。如果为 NULL,则检查字符串的前几百个字符。

但是通过NULL会产生错误:

将“void *”传递给不兼容类型“CFRange”的参数

这样做的正确方法是什么?

NSString *language = (NSString *)CFBridgingRelease(CFStringTokenizerCopyBestStringLanguage((CFStringRef)text, NULL));

4

1 回答 1

2

它看起来像文档中的错误。

NULL通常被定义为类似

#define NULL ((void*)0)

所以它是一个指针。

另一方面CFRange定义为

struct CFRange {
   CFIndex location;
   CFIndex length;
};
typedef struct CFRange CFRange;

所以它是一个结构,即非指针类型。

不能将结构分配给NULL,因为它们具有不兼容的类型,因此从技术上讲 aCFRange不能NULL

回到您的具体问题,您可能想做类似的事情

CFStringRef text = //your text
CFRange range = CFRangeMake(0, MIN(400, CFStringGetLength(text)));
NSString *language = (NSString *)CFBridgingRelease(CFStringTokenizerCopyBestStringLanguage(text, range));

自文档说明以来,我选择了 400

通常,该函数需要 200-400 个字符才能可靠地猜测字符串的语言。


更新

我向苹果报告了这个错误。

于 2013-09-26T21:21:45.607 回答