NSString中的字符编码转换为Unicode字符

3

我有一个包含字符代码的NSString,格式如下:0x1F514

我想将这个NSString添加到另一个NSString中,但不是使用它的字面值,而是隐藏在其后面的图标。在这种情况下,是一个铃铛表情符号。

我该如何轻松地将这个NSString转换为显示表情符号,而不是字符代码?


这个表情符号是一个编码图像吗? - pro_metedor
我猜他指的是代码点0x1f514,即这个:http://www.fileformat.info/info/unicode/char/1f514/index.htm。虽然,那不是一个“表情符号”。 - mattjgalloway
我正在使用这段代码来显示iPhone表情符号键盘中的表情符号。不确定我是否使用了正确的术语 :/ - Simen Øian Gjermundsen
0x1F514是一个“铃声”表情符号,来自常见的“Emoji”范围。我之前写的答案完全错误了,我会进行修正并更新! - mattjgalloway
如果您有一个字符串字面量@"\U0001F449"(而不是"\u1F449"),那么该字符串包含您想要的字符;无需特殊处理。只需正常地将字符串插入到TextView中即可。 - bames53
显示剩余2条评论
2个回答

2

这样做就可以了:

NSString *c = @"0x1F514";

unsigned intVal;
NSScanner *scanner = [NSScanner scannerWithString:c];
[scanner scanHexInt:&intVal];

NSString *str = nil;
if (intVal > 0xFFFF) {
    unsigned remainder = intVal - 0x10000;
    unsigned topTenBits = (remainder >> 10) & 0x3FF;
    unsigned botTenBits = (remainder >>  0) & 0x3FF;

    unichar hi = topTenBits + 0xD800;
    unichar lo = botTenBits + 0xDC00;
    unichar unicodeChars[2] = {hi, lo};
    str = [NSString stringWithCharacters:unicodeChars length:2];
} else {
    unichar lo = (unichar)(intVal & 0xFFFF);
    str = [NSString stringWithCharacters:&lo length:1];
}

NSLog(@"str = %@", str);

简单地说,@"\u1f514"无法正常工作是因为这些\u值不能超出BMP范围,即>0xFFFF,即>16位。
因此,我的代码检查了这种情况,并执行相关的代理对魔术来生成正确的字符串。
希望这正是您想要的并且易于理解!

1
如果你的NSString包含这个“bell”字符,那么它就是包含这个字符。你可以像使用stringByAppendingString一样通常地附加字符串。
绘制钟而不是表示未知字符的东西是一个完全独立的问题。你最好确保你不使用CoreText来绘制它,因为在其他地方已经报告过,并且我在工作中也看到过,当以这种方式打印各种非标准字符时可能无法正常工作。但是,当使用UIKit(应该是标准UI组件、UIKitAdditions等)打印时,它们确实可以正常工作。
如果使用CoreText,如果为具有此特殊字符的字符串禁用一些文本属性或选择适当的字体,则可能会有一点幸运(但我不会在这里帮助你;我们决定将问题留给Won't fix)。
话虽如此,我上次处理这些问题还是在iOS 6之前的日子里...
总结:你的问题不是附加字符串,而是如何绘制它们。

1
好的。我正在尝试通过设置UITextView的.text属性来绘制这个文本。这会有什么区别吗? - Simen Øian Gjermundsen
我们没有使用标准的iOS组件,所以我从来没有学习过它们的工作原理 ;) 但是,Emoji是关键词。请参见此问题的评论,例如:https://dev59.com/UmLVa4cB1Zd3GeqPtSPh 这看起来像是您遇到的问题,并提供了解决方案。 - Piotr Kalinowski
2
问题不是字符串实际上是“0x1F514”,而不是实际的“bell”字符吗?这就是我理解的。 - mattjgalloway
这将是字符编码的非常不寻常的解释。我需要代码。 - Piotr Kalinowski
1
这不是一个不寻常的字符编码解释,我想。0x1F514是一个Unicode代码点。 - mattjgalloway
是的,但是当我说字符串包含字符代码时,我的意思是该字符串包含具有给定字符代码的字符,而不是应仍转换为实际字符的十六进制字符串。 - Piotr Kalinowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接