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

时间:2015-12-30 06:43:42

标签: ios swift emoji

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

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

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

提前致谢。

2 个答案:

答案 0 :(得分:3)

更新Swift 4(Xcode 9)

截至Swift 4(使用Xcode 9 beta测试),“表情符号ZWJ序列”是 被视为Unicode 9标准规定的单Character

let str = "‍‍‍"
print(str.count) // 2
print(Array(str)) //  ["‍‍‍", ""]

同样String是其角色的集合(再次),所以我们可以 调用str.count获取长度,Array(str)获取所有内容 字符作为数组。

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

这只是部分答案,可能有助于这种特殊情况。

“”确实是四个独立字符的组合:

let str = "‍‍‍" //
print(Array(str.characters))

// Output: ["‍", "‍", "‍", "", ""]

用U + 200D(ZERO WIDTH JOINER)胶合在一起:

for c in str.unicodeScalars {
    print(String(c.value, radix: 16))
}

/* Output:
1f468
200d
1f468
200d
1f467
200d
1f467
1f60d
*/

使用.ByComposedCharacterSequences枚举字符串 选项正确组合这些字符:

var chars : [String] = []
str.enumerateSubstringsInRange(str.characters.indices, options: .ByComposedCharacterSequences) {
    (substring, _, _, _) -> () in
    chars.append(substring!)
}
print(chars)

// Output: ["‍‍‍", ""]

但是还有其他情况,这不起作用, 例如“旗帜”是一系列“区域指标” 字符“(比较Swift countElements() return incorrect value when count flag emoji)。用

let str = ""

上述循环的结果是

["", ""]

这不是理想的结果。

完整规则在"3 Grapheme Cluster Boundaries"中定义 在“标准附件#29 UNICODE TEXT SEGMENTATION”中 Unicode标准。

答案 1 :(得分:1)

您可以使用此代码example或此pod

要在Swift中使用它,请将类别导入YourProject_Bridging_Header

#import "NSString+EMOEmoji.h"

然后你可以检查字符串中每个表情符号的范围:

let example: NSString = "‍‍‍" // your string

let ranges: NSArray = example.emo_emojiRanges()  // ranges of the emojis

for value in ranges {

   let range:NSRange = (value as! NSValue).rangeValue

    print(example.substringWithRange(range))
}


// Output: ["‍‍‍", ""]

I created an small example project with the code above.

进一步阅读,这篇来自Instagram的有趣文章。