如何在文本字段中分隔输入的emojis(通过默认键盘)

Kir*_*nee 6 ios emoji swift

我在textfield中输入了两个表情符号,这里我得到的总长度为5个字符,而第一个表情符号则为4个字符,第二个表情符号为1个字符.看起来苹果已经将4个表情符号组合成一个表情符号.

我正在寻找快速代码,我可以单独分离每个表情符号,假设通过上面的例子我应该为每个表情符号分别获得2个字符串/字符.

任何人都可以帮我解决这个问题,我尝试了许多东西,比如正则表达式分离或componentsSeparatedByString或characterSet.但不幸的是最终结果是消极的.

提前致谢.

Mar*_*n R 4

Swift 4 (Xcode 9) 更新

\n\n

Character从 Swift 4 开始(使用 Xcode 9 beta 进行测试),“Emoji ZWJ 序列”按照 Unicode 9 标准的规定被视为单个:

\n\n
let str = "\xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8d"\nprint(str.count) // 2\nprint(Array(str)) //  ["\xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8d", ""]\n
Run Code Online (Sandbox Code Playgroud)\n\n

也是String其字符的集合(再次),因此我们可以调用str.count来获取长度,并将Array(str)所有字符作为数组获取。

\n\n
\n\n

(Swift 3 及更早版本的旧答案)

\n\n

这只是部分答案,在这种特殊情况下可能会有所帮助。

\n\n

“\xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8d”确实是四个单独字符的组合:

\n\n
let str = "\xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8d" //\nprint(Array(str.characters))\n\n// Output: ["\xe2\x80\x8d", "\xe2\x80\x8d", "\xe2\x80\x8d", "", ""]\n
Run Code Online (Sandbox Code Playgroud)\n\n

用 U+200D(零宽度连接器)粘合在一起:

\n\n
for c in str.unicodeScalars {\n    print(String(c.value, radix: 16))\n}\n\n/* Output:\n1f468\n200d\n1f468\n200d\n1f467\n200d\n1f467\n1f60d\n*/\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用 \noptions枚举字符串.ByComposedCharacterSequences可以正确组合这些字符:

\n\n
var chars : [String] = []\nstr.enumerateSubstringsInRange(str.characters.indices, options: .ByComposedCharacterSequences) {\n    (substring, _, _, _) -> () in\n    chars.append(substring!)\n}\nprint(chars)\n\n// Output: ["\xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8d", ""]\n
Run Code Online (Sandbox Code Playgroud)\n\n

但在其他情况下这不起作用,\ne.g “标志”是“区域指示符\n字符”序列(比较Swift countElements() 在计数标志 emoji 时返回不正确的值)。和

\n\n
let str = ""\n
Run Code Online (Sandbox Code Playgroud)\n\n

上述循环的结果是

\n\n
["", ""]\n
Run Code Online (Sandbox Code Playgroud)\n\n

这不是想要的结果。

\n\n

完整的规则在 Unicode 标准的“标准附件 #29 UNICODE 文本分段”中的“3 个字素簇边界”中定义。

\n