我在Objective-C应用程序中使用涉及中文Unihan字符的数据。我正在使用语音识别程序(cmusphinx)从我的数据中返回一个短语。它返回UTF-8字符,当返回一个中文字符(三个字节)时,它将它分成三个单独的字符。 例子:当我想要人时,我看到:‰∫∫。这是编码中的正确(E4 BA BA),但我的代码将返回值视为三个单独的字符而不是一个。
实际上,我的函数正在接收短语作为NSString,(由于环绕)使用UTF-16。我尝试使用Objective-C的内置转换方法(UTF-8和UTF-16),但这些方法将我的字符串保留为三个字符。
如何将这三个单独的字符解码为中文字符的一个utf-8代码点?
或者我该如何正确编码呢? 这是处理从sphinx返回的cstring及其编码为NSString的代码片段:
const char * hypothesis = ps_get_hyp(pocketSphinxDecoder, &recognitionScore, &utteranceID);
NSString *hypothesisString = [[NSString alloc] initWithCString:hypothesis encoding:NSMacOSRomanEncoding];
答案 0 :(得分:1)
编辑:通过查看帖子的添加内容,您实际上可以控制字符串编码。在这种情况下,当你期望utf-8时,为什么要用NSMacOSRomanEncoding
创建字符串?只需将其更改为NSUTF8StringEncoding
。
听起来你正在说的是你被赋予一个NSString,其中包含被解释为单字节编码的UTF-8数据(例如ISO-Latin-1,MacRoman等)。我假设您无法控制创建NSString的代码,因为如果您这样做,那么解决方案就是更改它初始化的编码。
在任何情况下,您要求的是一种获取字符串中的数据并将其转换回UTF-8的方法。您可以通过使用最初创建的任何编码从NSString创建NSData来实现此目的(至少需要了解这一点,否则它将无法工作),然后您可以从相同的数据创建新的NSString使用UTF-8。
从您给出的示例角色(人)来看,它看起来像是被解释为MacRoman,所以让我们继续吧。以下代码应将其转换回来:
- (NSString *)fixEncodingOfString:(NSString *)input {
CFStringEncoding cfEncoding = kCFStringEncodingMacRoman;
NSStringEncoding encoding = CFStringCovnertEncodingToNSStringEncoding(cfEncoding);
NSData *data = [input dataUsingEncoding:encoding];
if (!data) {
// the string wasn't actually in MacRoman
return nil;
}
NSString *output = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
}