如何在Swift字符串中包含表情符号?

24
这里有一篇关于iOS表情符号及其代码的不错文章。例如,\ue008代表小相机。

我在我的代码中尝试了这个方法:

var myText: String = "\ue008"

Xcode不接受此内容。如何包含它?


Ue008位于私人使用区域,因此您不能期望太多。 - gnasher729
那篇“相当不错的文章”似乎是一派胡言。在Mac上使用“字符查看器”获取_正确的_Unicode值。 - gnasher729
同 gnasher729 一样,这篇文章非常糟糕。 - John Doe
在这里回答了使用UnicodeScalar函数和简单示例 - Mehdi S.
9个回答

51

如果我理解您想要实现的内容,那么:

在XCode中按下"ctrl + cmd + space"。一个使用'hearts'表情符号的示例。

cell.textLabel?.text = "❤️" + " \(liker) liked \(userBeingliked)'s photo"

1
键盘快捷键可以在整个Mac操作系统中使用。 - holex

21

这是来自 Swift 文档:

let dollarSign = "\u{24}"        // $,  Unicode scalar U+0024
let blackHeart = "\u{2665}"      // ♥,  Unicode scalar U+2665
let sparklingHeart = "\u{1F496}" // , Unicode scalar U+1F496

请问Greg能否分享一下Swift文档链接给我? - R. Mohan
@R.Mohan 请查看此链接 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html - Greg

11

您完全不需要使用Unicode常量。只需使用字符查看器并直接输入字符即可。

let sparklingHeart = ""

11

1 解读Unicode编码:

extension String {
    var decodeEmoji: String{
        let data = self.data(using: String.Encoding.utf8);
        let decodedStr = NSString(data: data!, encoding: String.Encoding.nonLossyASCII.rawValue)
        if let str = decodedStr{
            return str as String
        }
        return self
    }
}

用法

let decodedString = yourString.decodeEmoji

2 将Unicode编码:

extension String {
    var encodeEmoji: String{
        if let encodeStr = NSString(cString: self.cString(using: .nonLossyASCII)!, encoding: String.Encoding.utf8.rawValue){
            return encodeStr as String
        }
        return self
    }
}

使用方法

let encodedString = yourString.encodeEmoji

7
您可以直接使用⌘ ^空格来插入表情符号。
或者,基于Greg的答案:
var myText: String = "\u{e008}"

1
问题在于他从一个只提供无用数值的网站得到了Unicode值。 E008只是错误的数字。 - gnasher729
9
你是指 ctrl + ⌘ + Space 吗? - Luca Angeletti
是的,这是另一种说法。 - Chris Slowik

5

如Greg在上面发布的那样,您可以使用OSx字符查看器直接输入表情符号到Swift中。字符查看器默认情况下是禁用的。以下是启用它的方法:

转到系统偏好设置>语言和地区>键盘首选项>键盘,然后选中在菜单栏中显示键盘、表情符号和符号查看器。选中后,您可以从右上角菜单栏中打开字符查看器,位于Wifi和日期/时间图标旁边。


1
从你的十六进制编码“0x1F52D”到实际的Emoji表情
let c = 0x1F602

下一步可能是从您的十六进制数中获取一个Uint32。
let intEmoji = UnicodeScalar(c!).value

从这里你可以做类似以下的事情:
titleLabel.text = String(UnicodeScalar(intEmoji)!)

在这里你有一个 ""

它也可以使用十六进制范围

let emojiRanges = [
            0x1F600...0x1F636,
            0x1F645...0x1F64F,
            0x1F910...0x1F91F,
            0x1F30D...0x1F52D
        ]

        for range in emojiRanges {
            for i in range {
                let c = UnicodeScalar(i)!.value
                data.append(c)
            }
        }

例如,从您的十六进制范围中获取多个UInt32


"let c = 0x1F602" 这个变量的数据类型是什么?@Mehdi S. - Azhagusundaram Tamil

0

在 MacOS 11 中,我花了一些时间才弄清楚这个问题,所以我想分享一下。

如果你喜欢输入 Unicode 字符而不是粘贴文字表情符号,你可以像这样查找系统表情符号的 Unicode:

  1. 聚焦/点击文本框(例如您的网络浏览器中的搜索栏)。

  2. 按下ctrl+cmd+space或在菜单栏中转到Edit->Emoji & Symbols

  3. 在字符查看器中向上滚动,直到您看到右上角的窗口扩展图标: Quick Character Viewer Expand

  4. 在扩展的字符查看器窗口中,按左上角按钮并选择Customize List...Character Viewer Customize List

  5. 向下滚动到Code Tables最小化列表,展开列表,切换到Unicode,然后按Done(系统因某种原因将此窗口更改为暗模式)。 Code Tables

  6. 现在,单击不同的表情符号,您应该会看到图像下面的Unicode代码。 Unicode

  7. 然后,您可以像这样注入Unicode:

var myText: String = "\u{e008}"

0
Chris Slowik和Greg的答案都很接近。 最简单的答案就是从这个字符串中“重新表达”你的字符串:
var myText: String = "\ue008"

转换为这个:

var myText: String = "\u{008}"

你附加的链接中找到的Unicode并没有错,正如其他人所声称的那样。你只需要在字符串内重新表述它。

你上面示例中的重要代码部分是“008”。

我创建了一个简单的函数来将这些Unicode转换为它们对应的表情符号:

func convertHexToEmoji(_ u:Int) -> String {
     return "\(UnicodeScalar(u)!)" }

使用方法:

let myText = convertHexToEmoji(008)
print(myText)

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