所以现在准备写个emoji的解码与编码函数
emoji表情编码:
func UnicodeEmojiCode(s string) string {
ret := ""
//string转成[]int32
rs := []rune(s)
//for _, v := range rs {
// print(len(string(v)))
//}
for i := 0; i < len(rs); i++ {
//如果发现有文字是emoji则:
if len(string(rs[i])) == 4 {
//以int64、16进制的方式,string的包装,存到数据库,例如:[\u1f3a0]
u := `[\u` + strconv.FormatInt(int64(rs[i]), 16) + `]`
ret += u
} else {
ret += string(rs[i])
}
}
return ret
}
大概逻辑就是:
假如前端传来🌙🌙hh
或者 🌙🌙66
或者 🌙🌙啊啊
或者🌙🌙。。
那就先把它转成[]int32,这个时候如果你尝试打印一下[]int32里每个元素转回string后的长度,会是这样:
4411 或者 4411 或者 4433 或者 4433
意思就是说🌙
的长度为4 h和6
的长度为1 啊和。
的长度为3
知道了这个以后就做个判断,如果检测到有东西长度为4就变成类似[\u1f3a0]这样;如果不为4就回到最初的模样
emoji表情解码:
func UnicodeEmojiDecode(s string) string {
// emoji表情的数据表达式 \[[\\u0-9a-zA-Z]+\]
// \\[[\\\\u0-9a-zA-Z]+\\] → \[[\\u0-9a-zA-Z]+\]
// \[ → [ \\u0-9a-zA-Z → \u加任意字符 []+ → 多个
re := regexp.MustCompile("\\[[\\\\u0-9a-zA-Z]+\\]")
// 提取emoji数据表达式 \[\\u|]
// |指明两项之间的一个选择 匹配 [\u 或 ]
reg := regexp.MustCompile("\\[\\\\u|]")
// 在 s 中查找 re 中编译好的正则表达式,并返回所有匹配的内容:{匹配项, 匹配项, ...}
// 只查找前 n 个匹配项,如果 n < 0,则查找所有匹配项
src := re.FindAllString(s, -1)
for i := 0; i < len(src); i++ {
// 在 src 中搜索匹配项,并替换为 repl 指定的内容,全部替换,并返回替换后的结果
// 也就是说src[i]的reg那里变为"",只要[\u1f48e]里面的1f48e
e := reg.ReplaceAllString(src[i], "")
// string "1f48e" → int32 127774
p, err := strconv.ParseInt(e, 16, 32)
if err == nil {
// 返回将s中前n个不重叠old子串都替换为new的新字符串,如果n<0会替换所有old子串。
// int32 127774 → string "🌙"
s = strings.Replace(s, src[i], string(rune(p)), -1)
}
}
return s
}
大概逻辑就是:
先从数据库获取[\u1f48e]666之类的emoji加文字的数据,再提取出[\u1f48e],装在string[]里,然后再把他们一个一个去掉[\u和],剩下1f48e之类的string,把这个转成int32,再转成string就会得到🌙,再进行原文替换
补充说明:
1.MustCompile用来解析正则表达式 expr 是否合法,如果合法,则返回一个 Regexp 对象, Regexp 对象可以在任意文本上执行需要的操作
2.当正则表达式不合法时,MustCompile会抛出异常