尝试修改表情符号序列时出现问题
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 Character
s(又名扩展字素簇)组成:
"⛹" (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("⛹⛹⛹")
我有以下函数,它接受一个带有表情符号的字符串,如果它是一个序列表情符号 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 Character
s(又名扩展字素簇)组成:
"⛹" (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("⛹⛹⛹")