【问题标题】:Get Description of Emoji Character获取表情符号字符的描述
【发布时间】:2014-09-02 04:30:45
【问题描述】:

每个表情符号都有一个描述,您可以在 Mac OS 的 ⌃⌘Space 特殊字符选择器中看到。有a list of them here。有没有办法让我在代码中查询这个描述(没有将它们全部输入到 Struct 中)?

我想做这样的事情:

let ????: Character = "????"
let ????desc: String = ????.description

并让????desc 解析为"SMILING FACE WITH OPEN MOUTH AND SMILING EYES"

【问题讨论】:

    标签: swift string character emoji


    【解决方案1】:

    Core Foundation 函数 CFStringTransform() 具有以下转换: 确定特殊字符的 Unicode 标准名称。示例:

    let c : Character = "?"
    
    let cfstr = NSMutableString(string: String(c)) as CFMutableString
    var range = CFRangeMake(0, CFStringGetLength(cfstr))
    CFStringTransform(cfstr, &range, kCFStringTransformToUnicodeName, false)
    print(cfstr)
    

    输出:

    \N{SMILING FACE WITH OPEN MOUTH AND SMILING EYES}
    

    有关更多信息,请参阅http://nshipster.com/cfstringtransform/ CFStringTransform().

    【讨论】:

    【解决方案2】:

    Martin R 的 answer 使用 Core Foundation 的 CFStringTransform() 仍然有效,但关键功能实际上来自 kCFStringTransformToUnicodeName,在 Swift 2 中我们可以像这样简单地使用它,通过与 NSString 桥接并调用 @987654326 @:

    let c: Character = "?"
    if let result = (String(c) as NSString)
        .stringByApplyingTransform(
            String(kCFStringTransformToUnicodeName),
            reverse: false) {
        print(result)
    }
    

    \N{张开嘴笑眼的笑脸}

    字符串也一样:

    let s: String = "This is a ?"
    if let result = (s as NSString)
        .stringByApplyingTransform(
            String(kCFStringTransformToUnicodeName),
            reverse: false) {
        print(result)
    }
    

    这是一张\N{张着嘴笑着眼睛的笑脸}

    【讨论】:

    • 对于 Swift 3 Swift 4,请参阅 @scott-gardner's version 和 Martin R 的评论。我的只适用于 Swift 2。
    【解决方案3】:

    Eric Aya 的 Swift 3 版本的回答:

    let s = "This is a ?"
    
    if let result = s.applyingTransform(
        kCFStringTransformToUnicodeName as StringTransform,
        reverse: false) {
        print(result)
    }
    

    这是一张\N{张着嘴笑着眼睛的笑脸}

    【讨论】:

    • 更简单:s.applyingTransform(.toUnicodeName, reverse: false)
    【解决方案4】:

    使用 Swift 5,您可以使用以下两种方式之一来获取 Emoji 字符的描述。


    #1。使用Unicode.Scalar.Propertiesname 属性

    Unicode.Scalar.Properties 有一个name 属性。 name 有以下声明:

    var name: String? { get }
    

    标量的发布名称。

    下面的 Playground 代码示例展示了如何使用 name 来获取已发布的 Unicode 标量名称:

    let emoji: Character = "?"
    for scalar in emoji.unicodeScalars {
        print(scalar.properties.name)
    }
    
    /*
     prints: Optional("SMILING FACE WITH OPEN MOUTH AND SMILING EYES")
     */
    

    #2。使用Unicode.Scalar.PropertiesnameAlias 属性

    Unicode.Scalar.Properties 还有一个名为nameAlias 的属性,声明如下:

    var nameAlias: String? { get }
    

    标量的规范形式别名。 [...] nameAlias 属性用于在错误发布名称时进行更正。例如,U+FE18 的名称是“Presentation FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET”(注意“BRACKET”拼写错误)。然后nameAlias 属性包含更正后的名称。

    下面的 Playground 示例代码显示了 U+FE18 Unicode 标量 namenameAlias 之间的区别:

    let emoji: Character = "\u{FE18}" // ︘
    for scalar in emoji.unicodeScalars {
        print(scalar.properties.name)
    }
    /*
     prints:
     Optional("PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET")
     */
    
    let emoji: Character = "\u{FE18}" // ︘
    for scalar in emoji.unicodeScalars {
        print(scalar.properties.nameAlias)
    }
    /*
     prints:
     Optional("PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRACKET")
     */
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      相关资源
      最近更新 更多