【问题标题】:How is the ???????? character represented in Swift strings?怎么样了??????用 Swift 字符串表示的字符?
【发布时间】:2014-07-23 03:23:22
【问题描述】:

与其他一些表情符号字符一样,0x0001F1E9 0x0001F1EA 组合(德国国旗)在屏幕上表示为单个字符,尽管它实际上是两个不同的 Unicode 字符点组合。它在 Swift 中是用一两个不同的字符表示的吗?

【问题讨论】:

  • Swift 字符串完全是 Unicode。测试时会发生什么?
  • 这两个字符(不在我的浏览器中呈现)是“区域指标符号字母 D”和“区域指标符号字母 E”。我可以看到与德国的联系,但它们在什么情况下呈现为德国国旗?
  • @Keith,在 iOS 和 OSX 上,它呈现为德国国旗表情符号。你可以用谷歌搜索(我自己不能提供链接,在移动右边割草)
  • Ole 的这篇博文深入解答了您的问题:oleb.net/blog/2014/07/swift-strings
  • 在 Android 上,您还会看到一个标志。在 Windows 上,字母 DE。

标签: unicode emoji swift


【解决方案1】:
let flag = "\u{1f1e9}\u{1f1ea}"

那么flag 就是??。

更多区域指标符号见:
http://en.wikipedia.org/wiki/Regional_Indicator_Symbol

【讨论】:

  • 我认为你只是在重申问题
【解决方案2】:

与此同时,Swift 已添加对“扩展字素簇”的支持。 迭代字符串的字符会产生单个字符 “旗帜”:

let string = "Hi??!"
for char in string.characters {
    print(char)
}

输出:

H 一世 ?? !

【讨论】:

    【解决方案3】:

    Swift 3 在其 String 结构中实现了 Unicode。在 Unicode 中,所有标志都是成对的 Regional Indicator Symbols。所以,?? 实际上是? 后跟?(尝试将两者复制并粘贴到彼此旁边!)。

    当两个或多个区域指示符号彼此相邻放置时,它们会形成一个“扩展字素簇”,这意味着它们被视为一个字符。这就是为什么"?? = ??????...".characters 给你["??", " ", "=", " ", "??????", ".", ".", "."]

    如果您想查看每一个 Unicode 代码点(也称为“标量”),可以使用 .unicodeScalars,这样 "Hi??!".unicodeScalars 就会为您提供 ["H", "i", "?", "?", "!"]

    tl;博士

    ?? 是一个 字符(在 Swift 和 Unicode 中),由两个 代码点 em>(AKA 标量)。不要忘记这些是不同的! ?


    另见

    【讨论】:

      【解决方案4】:

      Swift 不会告诉你 String 的内部表示是什么。您与 String 作为全尺寸(32 位)Unicode 代码点列表进行交互:

      for character in "Dog!?" {
          println(character)
      }
      // prints D, o, g, !, ?
      

      如果要将字符串作为 UTF-8 或 UTF-16 代码点序列使用,请使用其 utf8utf16 属性。请参阅文档中的 Strings and Characters

      【讨论】:

      • 那么,德国国旗表情会被这个操作一分为二吗?像这样的方法没有一些辅助方法吗?
      • 错误;您可以使用string.unicodeScalars 而不是string.characters 并获得"Hi??!".unicodeScalars == ["H","i","?","?","!"]
      【解决方案5】:

      使用 Swift 5,您可以遍历标志表情符号字符的 unicodeScalars 属性,以打印组成它的 Unicode 标量值:

      let emoji: Character = "??"
      for scalar in emoji.unicodeScalars {
          print(scalar)
      }
      /*
       prints:
       ?
       ?
       */
      

      如果你结合这些标量(即区域指示符号),你会得到一个标志表情符号:

      let italianFlag = "?" + "?"
      print(italianFlag) // prints: ??
      print(italianFlag.count) // prints: 1
      

      每个Unicode.Scalar 实例还有一个属性value,您可以使用它来显示它的数字表示:

      let emoji: Character = "??"
      for scalar in emoji.unicodeScalars {
          print(scalar.value)
      }
      /*
       prints:
       127470
       127481
       */
      

      您可以从这些数字表示创建 Unicode 标量,然后将它们关联到一个字符串中:

      let scalar1 = Unicode.Scalar(127470)
      let scalar2 = Unicode.Scalar(127481)
      let italianFlag = String(scalar1!) + String(scalar2!)
      print(italianFlag) // prints: ??
      print(italianFlag.count) // prints: 1
      

      如果需要,您可以使用Unicode.Scalarescaped(asASCII:) 方法来显示Unicode 标量的字符串表示(使用ASCII 字符):

      let emoji: Character = "??"
      for scalar in emoji.unicodeScalars {
          print(scalar.escaped(asASCII: true))
      }
      /*
       prints:
       \u{0001F1EE}
       \u{0001F1F9}
       */
      
      let italianFlag = "\u{0001F1EE}\u{0001F1F9}"
      print(italianFlag) // prints: ??
      print(italianFlag.count) // prints: 1
      

      Stringinit(_:radix:uppercase:) 也可能与将标量值转换为十六进制值有关:

      let emoji: Character = "??"
      for scalar in emoji.unicodeScalars {
          print(String(scalar.value, radix: 16, uppercase: true))
      }
      /*
       prints:
       1F1EE
       1F1F9
       */
      
      let italianFlag = "\u{1F1EE}\u{1F1F9}"
      print(italianFlag) // prints: ??
      print(italianFlag.count) // prints: 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-15
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多