代码之家  ›  专栏  ›  技术社区  ›  Robo Robok

无效的狗脸标量

  •  3
  • Robo Robok  · 技术社区  · 5 年前

    我认为我很好地理解unicode scalars在swift中的用法,但狗脸emoji证明了我的错误。

    for code in "🐶".utf16 {
        print(code)
    }
    

    UTF-16代码是 55357 56374 . 在十六进制,那是 d83d dc36 .

    现在:

    let dog = "\u{d83d}\u{dc36}"
    

    我得到的不是一个带“__¶”的字符串,而是一个错误:

    无效的Unicode标量

    我试过使用UTF-8代码,但都不起作用。不是抛出错误,而是返回“_¶”而不是狗脸。

    这里怎么了?

    1 回复  |  直到 5 年前
        1
  •  6
  •   Martin R    5 年前

    这个 \u{nnnn} 转义序列需要 Unicode scalar value ,而不是UTF-16表示(具有高代理和低代理):

    for code in "🐶".unicodeScalars {
        print(String(code.value, radix: 16))
    }
    // 1f436
    
    let dog = "\u{1F436}"
    print(dog) // 🐶
    

    从其utf-16表示形式重新构造字符串的解决方案可以在 Is there a way to create a String from utf16 array in swift? . 例如:

    let utf16: [UInt16] = [ 0xd83d, 0xdc36 ]
    let dog = String(utf16CodeUnits: utf16, count: utf16.count)
    print(dog) // 🐶