Objective c Unihan:组合UTF-8字符

Objective c Unihan:组合UTF-8字符,objective-c,unicode,utf-8,Objective C,Unicode,Utf 8,我在Objective-C应用程序中使用的数据涉及中文Unihan字符。我正在使用一个语音识别程序(cmusphinx),它从我的数据中返回一个短语。它返回UTF-8字符,当返回一个汉字(三个字节)时,它将其分成三个单独的字符。 当我想的时候人 对,我明白了:‰∫∫. 这是正确的编码方式(E4-BA-BA),但我的代码将返回值视为三个独立的字符,而不是一个 实际上,我的函数是以NSString的形式接收短语(由于环绕),它使用UTF-16。我尝试使用Objective-C的内置转换方法(到UTF

我在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];

编辑:通过查看添加到帖子中的内容,您实际上可以控制字符串编码。在这种情况下,当您需要utf-8时,为什么要使用
NSMacOSRomanEncoding
创建字符串?只需将其更改为
NSUTF8StringEncoding


听起来您的意思是,您得到了一个NSString,其中包含被解释为单字节编码的UTF-8数据(例如ISO-Latin-1、MacRoman等)。我在这里假设您无法控制创建NSString的代码,因为如果您控制了,那么解决方案就是更改初始化时使用的编码

在任何情况下,您需要的是一种获取字符串中的数据并将其转换回UTF-8的方法。您可以通过使用最初创建NSString时使用的任何编码从NSString创建NSData(至少您需要了解这一点,否则它将不起作用),然后您可以使用UTF-8从相同的数据创建新的NSString

从您给出的示例角色(人) 看起来它被解释为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];
}

你确定你不是说你有3个字节组成一个UTF-8字符序列,你想把它们解码成一个unicode码点吗?你在用什么语言?请给我们看一些代码。对不起,我会澄清一下。我不太了解这个词汇表,所以这很有帮助。我不太了解Objective-C,但在大多数有
字节
s数组和
字符
s数组之间的差异然后解码功能通常从字节到字符。字符通常对应于UTF-16或UTF-32代码单元。在UTF-16的情况下,任何<0x10000的代码点直接对应于UTF-16代码单元,但对应于两个。解码时,是y我们的输入
byte
s或
char
s?NSString是Unicode字符集上的一个数组(类型unichar),尽管我可以很容易地将其作为cstring(char*)获得。
NSString
应该是UTF-8 byte[]到unichr[]的输出解码,而不是输入。在这个过程的早期应该有一个地方,你可以指定一个编码,但是没有编码,我无法指向哪里。非常感谢!我收到的字符之间的空格导致更改整个cstring的编码损坏了数据。但是我只是解析了每一个字符,你的方法工作得很好.