如何在 Swift 中获取字符/字符串的 unicode 代码点表示?

Ahm*_*d F 2 string unicode character codepoint swift

作为通用解决方案,我们如何在 Swift 中获取字符或字符串的 unicode 代码点?

\n\n

考虑以下:

\n\n
let A: Character = "A"     // "\\u{0041}"\nlet A\xcc\x81: Character = "A\xcc\x81"     // "\\u{0041}\\u{0301}"\n\nlet sparklingHeart = ""  // "\\u{1F496}"\nlet SWIFT = "SWIFT"        // "\\u{0053}\\u{0057}\\u{0049}\\u{0046}\\u{0054}"\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我没有记错的话,所需的函数可能会返回一个字符串数组,例如:

\n\n
extension Character {\n    func getUnicodeCodePoints() -> [String] {\n        //...\n    }\n}\n\nA.getUnicodeCodePoints()\n// the output should be: ["\\u{0041}"]\n\nA\xcc\x81.getUnicodeCodePoints()\n// the output should be: ["\\u{0041}", "\\u{0301}"]\n\nsparklingHeart.getUnicodeCodePoints()\n// the output should be: ["\\u{1F496}"]\n\nSWIFT.getUnicodeCodePoints()\n// the output should be: ["\\u{0053}", "\\u{0057}", "\\u{0049}", "\\u{0046}", "\\u{0054}"]\n
Run Code Online (Sandbox Code Playgroud)\n\n

任何更多建议的优雅方法将不胜感激。

\n

Mar*_*n R 6

通常,unicodeScalarsa 的属性String返回其 unicode 标量值的集合。(Unicode 标量值是除高代理项和低代理项代码点之外的任何\nUnicode 代码点。)

\n\n

例子:

\n\n
print(Array("\xc3\x81".unicodeScalars))  // ["A", "\\u{0301}"]\nprint(Array("".unicodeScalars)) // ["\\u{0001F496}"]\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 Swift 3 之前,无法Character直接访问 \na 的 unicode 标量值,必须\n将其转换为 aString(对于 Swift 4 状态,请参见下文)。

\n\n

如果您想将所有 Unicode 标量值视为十六进制数字\n那么您可以访问该value属性(这是一个UInt32数字)\n并根据您的需要对其进行格式化。

\n\n

示例(使用U+NNNNUnicode 值的表示法):

\n\n
extension String {\n    func getUnicodeCodePoints() -> [String] {\n        return unicodeScalars.map { "U+" + String($0.value, radix: 16, uppercase: true) }\n    }\n}\n\nextension Character {\n    func getUnicodeCodePoints() -> [String] {\n        return String(self).getUnicodeCodePoints()\n    }\n}\n\n\nprint("A".getUnicodeCodePoints())     // ["U+41"]\nprint("\xc3\x81".getUnicodeCodePoints())     // ["U+41", "U+301"]\nprint("".getUnicodeCodePoints())    // ["U+1F496"]\nprint("SWIFT".getUnicodeCodePoints()) // ["U+53", "U+57", "U+49", "U+46", "U+54"]\nprint("".getUnicodeCodePoints())    // ["U+1F1EF", "U+1F1F4"]\n
Run Code Online (Sandbox Code Playgroud)\n\n

Swift 4 更新:

\n\n

从 Swift 4 开始,可以直接访问unicodeScalarsa ,\n请参阅SE-0178 将 unicodeScalars 属性添加到 Character。这使得转换为CharacterString过时:

\n\n
let c: Character = ""\nprint(Array(c.unicodeScalars)) // ["\\u{0001F1EF}", "\\u{0001F1F4}"]\n
Run Code Online (Sandbox Code Playgroud)\n