如何删除非打印字符

7

我正在尝试从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字符,但这也会移除重音符号。

我该如何仅移除不可打印字符?


请参考此链接 what-is-the-range-of-unicode-printable-characters。 icza 的回答非常好。 - mbyd916
3个回答

24

前言:我在我的github.com/icza/gox库中发布了这个实用程序,请查看stringsx.Clean()


你可以删除那些unicode.IsGraphic()unicode.IsPrint()返回false的符文。要从字符串中删除某些rune,您可以使用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

12

2

仅供参考,

我经常使用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
}

然而,使用如下的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
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接