如何删除不可打印的字符

我正在尝试从 Golang 中的字符串中删除不可打印的字符。


https://play.golang.org/p/Touihf5-hGH


invisibleChars := "Douglas"

fmt.Println(invisibleChars)

fmt.Println(len(invisibleChars))


normal := "Douglas"

fmt.Println(normal)

fmt.Println(len(normal))

输出:


Douglas

10

Douglas

7

第一个字符串末尾有一个不可见的字符。


我尝试替换非 ASCII 字符,但它也删除了重音符号。


如何仅删除不可打印的字符?


慕森卡
浏览 92回答 3
3回答

慕姐8265434

前言:我在我的github.com/icza/gox库中发布了这个实用程序,请参阅stringsx.Clean()。您可以在报告错误的地方删除符unicode.IsGraphic()文unicode.IsPrint()。rune要从字符串中删除某些s,您可以使用strings.Map().例如:invisibleChars := "Douglas"fmt.Printf("%q\n", invisibleChars)fmt.Println(len(invisibleChars))clean := strings.Map(func(r rune) rune {    if unicode.IsGraphic(r) {        return r    }    return -1}, invisibleChars)fmt.Printf("%q\n", clean)fmt.Println(len(clean))clean = strings.Map(func(r rune) rune {    if unicode.IsPrint(r) {        return r    }    return -1}, invisibleChars)fmt.Printf("%q\n", clean)fmt.Println(len(clean))输出(在Go Playground上尝试):"Douglas\u200b"10"Douglas"7"Douglas"7

天涯尽头无女友

invisibleChars = strings.TrimFunc(invisibleChars, func(r rune) bool {        return !unicode.IsGraphic(r)    })去游乐场:https://play.golang.org/p/39yWgnnRPXr

交互式爱情

仅供参考,我经常使用strings.TrimFunc,但我发现strings.Map()检测不可见字符比strings.TrimFunc.strings.TrimFunc无法检测输入字符是否为"Douglas\u200b" + "bar"。如果后面跟有“bar”,则以下示例将失败。结果变成了13而不是10。func ExampleTrimFunc() {    invisibleChars := "Douglas\u200b" + "bar"    invisibleChars = strings.TrimFunc(invisibleChars, func(r rune) bool {        return !unicode.IsGraphic(r)    })    fmt.Println(invisibleChars)    fmt.Println(len(invisibleChars))    normal := "Douglasbar"    fmt.Println(normal)    fmt.Println(len(normal))    // Output:    // Douglasbar    // 10    // Douglasbar    // 10}https://go.dev/play/p/TB-98P081U4 @ Go 游乐场但是,strings.Map()如下使用是成功的。 func ExampleTrimFunc() {    invisibleChars := "Douglas\u200b" + "bar"-   invisibleChars = strings.TrimFunc(invisibleChars, func(r rune) bool {-       return !unicode.IsGraphic(r)-   })+   invisibleChars = strings.Map(func(r rune) rune {+       if unicode.IsGraphic(r) {+           return r+       }+       return -1+   }, invisibleChars)     fmt.Println(invisibleChars)    fmt.Println(len(invisibleChars))     normal := "Douglasbar"    fmt.Println(normal)    fmt.Println(len(normal))     // Output:    // Douglasbar    // 10    // Douglasbar    // 10 }https://go.dev/play/p/4ybnKVh2NDZ @ Go 游乐场
打开App,查看更多内容
随时随地看视频慕课网APP