尝试修改表情符号序列时出现问题

Issues when attempting to modify an emoji sequence

我有以下函数,它接受一个带有表情符号的字符串,如果它是一个序列表情符号 a+b,它将保持 a 不变,并将 b 更改为不同的表情符号

func changeEmoji(givenString:String)->(String){

 let emojiDictionary :[String:String] = [
"⛹" : "⛹",
"♀️" : "",
"" : "",
"♂️" :"",
]

let stringCharacters=Array(givenString.characters)
var returnedString=String()

for character in stringCharacters{

if emojiDictionary[String(character)] == nil {
    return "error"
}
else {
     returnedString=returnedString+emojiDictionary[String(character)]!
}
}
return  returnedString
}

我没问题

  changeEmoji(givenString: "⛹⛹")

它输出:“⛹⛹”

但是:

 changeEmoji(givenString: "⛹⛹⛹‍♀️")

输出 "error" 虽然它不应该作为 ♀ Female Sign and Variation Selector-16 是我的 emojiDictionary 中的第二个键.. 男性符号和变体选择器也出现类似问题。

知道为什么会这样吗?

问题是“⛹‍♀️”由3个Swift Characters(又名扩展字素簇)组成:

  • "⛹‍" (U+26F9 有球的人)

  • "‍" (U+1F3FB Emoji Modifier Fitzpatrick Type-1-2, U+200D ZERO WIDTH JOINER)

  • "♀️" (U+2640 女号, U+FE0F VARIATION SELECTOR-16)

但是,你的emojiDictionary只有一个“”(U+1F3FB Emoji Modifier Fitzpatrick Type-1-2),与“⛹‍♀️”的第二个Character不匹配因为它缺少零宽度连接器。

因此,最简单的解决方案是在您的字典中添加另一个键,以包含 Emoji Modifier Fitzpatrick Type-1-2 字符,具有零宽度连接符后缀。最清楚的方法是在它后面加上 unicode 转义序列 \u{200D}.

例如:

func changeEmoji(givenString: String) -> String? {

    // I have included the unicode point breakdowns for clarity
    let emojiDictionary : [String : String] = [
        "⛹" : "⛹", // 26F9 : 26F9
        "♀️" : "", // 2640, fe0f : 1f469
        "" : "", // 1f3fb : 1f4a4
        "\u{200D}" : "", // 1f3fb, 200d : 1f4a4
        "♂️" :"" // 2642, fe0f : 1f468
        ]

    // Convert characters of string to an array of string characters,
    // given that you're just going to use the String(_:) initialiser later.
    let stringCharacters = givenString.characters.map(String.init(_:))
    var returnedString = ""

    for character in stringCharacters {
        guard let replacementCharacter = emojiDictionary[character] else {
            // I would advise making your method return an optional
            // in cases where the string can't be converted.
            // Failure is shown by the return of nil, rather than some
            // string sentinel.
            return nil
        }
        returnedString += replacementCharacter
    }
    return returnedString
}

print(changeEmoji(givenString: "⛹⛹⛹‍♀️")) // Optional("⛹⛹⛹")