我在一个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];
发布于 2011-11-04 06:35:49
编辑:从添加到你的帖子中,你实际上已经控制了字符串编码。在这种情况下,当您期待utf-8时,为什么还要用NSMacOSRomanEncoding
创建字符串呢?只需将其更改为NSUTF8StringEncoding
。
听起来就像你所说的那样,你得到的是一个包含UTF-8数据的NSString,它被解释为单字节编码(例如ISO- saying 1,MacRoman等)。我在这里假设您无法控制创建NSString的代码,因为如果您这样做了,那么解决方案就是更改它初始化时使用的编码。
在任何情况下,您需要的是一种获取字符串中的数据并将其转换回UTF-8的方法。为此,您可以使用最初创建NSData的编码从NSString创建一个NSString (您至少需要了解这一点,否则它将无法工作),然后您可以使用UTF-8从相同的数据创建新的UTF。
从您给出的示例字符(人)看,它似乎被解释为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];
}
https://stackoverflow.com/questions/7932793
复制相似问题