Sak*_*kib 7 utf-8 special-characters go
我正在尝试编写一个函数来截断golang中带有特殊字符的字符串.一个例子如下
"H???????üöžå???¤"
但是我根据允许的字符数量在中间切割它.这会导致数据损坏.
结果就像
H???????üöžå?...
本?不应该存在.我们如何检测这些特殊字符并根据这些字符的长度将其拆分?
package main
import (
"fmt"
"regexp"
)
var reNameBlacklist = regexp.MustCompile(`(&|>|<|\/|:|\n|\r)*`)
var maxFileNameLength = 30
// SanitizeName sanitizes user names in an email
func SanitizeName(name string, limit int) string {
result := name
reNameBlacklist.ReplaceAllString(result, "")
if len(result) > limit {
result = result[:limit] + "..."
}
return result
}
func main() {
str := "H???????üöžå???¤"
fmt.Println(str)
strsan := SanitizeName(str, maxFileNameLength)
fmt.Println(strsan)
}
Run Code Online (Sandbox Code Playgroud)
切片字符串将它们视为基础字节数组; slice运算符对字节索引进行操作,而不是符文(每个符号可以是多个字节).但是,range在字符串上迭代符文 - 但返回的索引是字节.这使你可以非常直接地完成你正在寻找的东西(这里有完整的游乐场示例):
func SanitizeName(name string, limit int) string {
reNameBlacklist.ReplaceAllString(name, "")
result := name
chars := 0
for i := range name {
if chars >= limit {
result = name[:i]
break
}
chars++
}
return result
}
Run Code Online (Sandbox Code Playgroud)
Go博客上有更详细的解释