【问题标题】:Character code in NSString to unicode characterNSString 中的字符代码到 unicode 字符
【发布时间】:2012-10-18 20:19:57
【问题描述】:

我有一个NSString 和一个charactercode,如下所示:0x1F514。 我想把这个NSString 添加到另一个NSString,但不是用它的字面值,而是隐藏在它后面的图标。在这种情况下,一个铃铛的表情符号。

如何轻松转换此NSString 以显示表情符号而不是字符代码?

【问题讨论】:

  • 这个表情是编码图像吗?
  • 我认为他的意思是代码点 0x1f514,即:fileformat.info/info/unicode/char/1f514/index.htm。虽然,那不是“表情符号”。
  • 我正在使用此代码显示来自 iPhone-emoji-keyboard 的表情符号。不确定我是否使用了正确的术语:/
  • 0x1F514 是一个“铃铛”,是的,来自众所周知的“表情符号”范围。我写了一个答案,但这是完全错误的。我会修复和更新!
  • 所以你有一个像“????”这样的字符串(如果你有合适的字体,就会有a bell in those quotes)并且你想将它添加到另一个字符串......你的意思是像连接字符串? “A”+“B”=“AB”? “隐藏在它后面的图标”是什么意思?你想在哪里显示角色,你在做什么错了?

标签: ios objective-c unicode character-encoding emoticons


【解决方案1】:

这样的事情会做:

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 位。

所以,我的代码所做的是检查该场景并执行相关的surrogate pair magic 以生成正确的字符串。

希望这实际上是您想要的并且有意义!

【讨论】:

    【解决方案2】:

    如果你的 NSString 包含这个“bell”字符,那么它包含。您只需按照通常的方式附加字符串,例如 stringByAppendingString

    绘制铃铛而不是表示未知字符的东西是一个完全独立的问题。您最好的选择是确保您没有使用 CoreText 来绘制它,因为它已在其他地方报告过,而且我自己在工作中也看到过,以这种方式打印时,各种非标准字符可能无法正常工作。但是,当使用 UIKit(应该是标准的 UI 组件、UIKitAdditions 等)打印时,它们确实可以工作。

    如果使用 CoreText,如果您禁用带有此特殊字符的字符串的某些文本属性,或者选择适当的字体,您可能会有点幸运(但我不会在这里帮助您;我们决定将问题保留为 Won' t 修复)。

    话虽如此,我最后一次处理这些问题是在 iOS 之前的 6 天...

    总结:你的问题不是附加字符串,而是你如何绘制它们。

    【讨论】:

    • 好的。我正在尝试通过设置 UITextView 的 .text-property 来绘制此文本。这有什么区别吗?
    • 我们没有使用标准的 iOS 组件,所以我不需要了解它们的工作原理;)表情符号是关键词。请参阅此问题的 cmets,例如:stackoverflow.com/questions/9940278/… 这看起来正是您提出的解决方案的问题。
    • 问题不是字符串实际上是“0x1F514”,而不是“bell”字符吗?反正我是这么理解的。
    • 这将是对字符代码的相当不寻常的解释。我要代码。
    • 我会说,这不是对字符代码的不寻常解释。 0x1F514 是一个 unicode 代码点。
    猜你喜欢
    • 2013-10-17
    • 2016-11-16
    • 1970-01-01
    • 2018-07-04
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多