Golang截断具有特殊字符的字符串而不会破坏数据

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)

Adr*_*ian 8

切片字符串将它们视为基础字节数组; 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博客上有更详细的解释