如何在Objective-C中将unichar值转换为NSString?

Ter*_*rry 31 unicode objective-c nsstring

我有一个存储在unichar变量中的国际字符.此字符不是来自文件或网址.变量本身只存储一个无符号短(0xce91),它是UTF-8格式并转换为希腊大写字母'A'.我试图将该字符放入NSString变量但我失败了.

我尝试了两种不同的方法,其中两种都不成功:

unichar greekAlpha = 0xce91; //could have written greekAlpha = '?' instead.

NSString *theString = [NSString stringWithFormat:@"Greek Alpha: %C", greekAlpha];
Run Code Online (Sandbox Code Playgroud)

不好.我得到一些奇怪的汉字.作为旁注,这与英文字符完美配合.

然后我也尝试了这个:

NSString *byteString = [[NSString alloc] initWithBytes:&greekAlpha
                                                length:sizeof(unichar)
                                              encoding:NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)

但这也不起作用.我显然做了一件非常糟糕的事,但我不知道是什么.有谁可以帮助我吗 ?谢谢!

mat*_*att 55

unichar greekAlpha = 0x0391;
NSString* s = [NSString stringWithCharacters:&greekAlpha length:1];
Run Code Online (Sandbox Code Playgroud)

现在,您可以以任何您喜欢的方式将NSString合并到另一个中.但请注意,现在将希腊字母直接键入NSString文字是合法的.


hal*_*ski 21

由于0xce91采用UTF-8格式并且%C期望它采用UTF-16,因此像上面那样的简单解决方案将无效.为了stringWithFormat:@"%C"工作,你需要输入0x391哪个是UTF-16 unicode.

为了从UTF-8编码的unichar创建一个字符串,你需要先将unicode拆分成它的八位字节然后再使用initWithBytes:length:encoding.

unichar utf8char = 0xce91; 
char chars[2];
int len = 1;

if (utf8char > 127) {
    chars[0] = (utf8char >> 8) & (1 << 8) - 1;
    chars[1] = utf8char & (1 << 8) - 1; 
    len = 2;
} else {
    chars[0] = utf8char;
}

NSString *string = [[NSString alloc] initWithBytes:chars
                                            length:len 
                                          encoding:NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.这正是我想要的!那么,我的位被炒了:).即使我是这个网站的新成员,我已经使用它已经有一段时间了(主要是c#的东西,只是用目标c弄湿我的脚)我发现有些人会去帮助别人.再一次,谢谢!:) (4认同)