我在textfield中输入了两个表情符号,这里我得到的总长度为5个字符,而第一个表情符号则为4个字符,第二个表情符号为1个字符.看起来苹果已经将4个表情符号组合成一个表情符号.
我正在寻找快速代码,我可以单独分离每个表情符号,假设通过上面的例子我应该为每个表情符号分别获得2个字符串/字符.
任何人都可以帮我解决这个问题,我尝试了许多东西,比如正则表达式分离或componentsSeparatedByString或characterSet.但不幸的是最终结果是消极的.
提前致谢.
Swift 4 (Xcode 9) 更新
\n\nCharacter从 Swift 4 开始(使用 Xcode 9 beta 进行测试),“Emoji ZWJ 序列”按照 Unicode 9 标准的规定被视为单个:
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", ""]\nRun Code Online (Sandbox Code Playgroud)\n\n也是String其字符的集合(再次),因此我们可以调用str.count来获取长度,并将Array(str)所有字符作为数组获取。
(Swift 3 及更早版本的旧答案)
\n\n这只是部分答案,在这种特殊情况下可能会有所帮助。
\n\n“\xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8d”确实是四个单独字符的组合:
\n\nlet 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", "", ""]\nRun Code Online (Sandbox Code Playgroud)\n\n用 U+200D(零宽度连接器)粘合在一起:
\n\nfor c in str.unicodeScalars {\n print(String(c.value, radix: 16))\n}\n\n/* Output:\n1f468\n200d\n1f468\n200d\n1f467\n200d\n1f467\n1f60d\n*/\nRun Code Online (Sandbox Code Playgroud)\n\n使用 \noptions枚举字符串.ByComposedCharacterSequences可以正确组合这些字符:
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", ""]\nRun Code Online (Sandbox Code Playgroud)\n\n但在其他情况下这不起作用,\ne.g “标志”是“区域指示符\n字符”序列(比较Swift countElements() 在计数标志 emoji 时返回不正确的值)。和
\n\nlet str = ""\nRun Code Online (Sandbox Code Playgroud)\n\n上述循环的结果是
\n\n["", ""]\nRun Code Online (Sandbox Code Playgroud)\n\n这不是想要的结果。
\n\n完整的规则在 Unicode 标准的“标准附件 #29 UNICODE 文本分段”中的“3 个字素簇边界”中定义。
\n| 归档时间: |
|
| 查看次数: |
875 次 |
| 最近记录: |