为了账号安全,请及时绑定邮箱和手机立即绑定

如何删除不可打印的字符

如何删除不可打印的字符

Go
慕森卡 2023-08-07 14:34:00
我正在尝试从 Golang 中的字符串中删除不可打印的字符。https://play.golang.org/p/Touihf5-hGHinvisibleChars := "Douglas"fmt.Println(invisibleChars)fmt.Println(len(invisibleChars))normal := "Douglas"fmt.Println(normal)fmt.Println(len(normal))输出:Douglas10Douglas7第一个字符串末尾有一个不可见的字符。我尝试替换非 ASCII 字符,但它也删除了重音符号。如何仅删除不可打印的字符?
查看完整描述

3 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

前言:我在我的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


查看完整回答
反对 回复 2023-08-07
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

invisibleChars = strings.TrimFunc(invisibleChars, func(r rune) bool {

        return !unicode.IsGraphic(r)

    })


查看完整回答
反对 回复 2023-08-07
?
交互式爱情

TA贡献1712条经验 获得超3个赞

仅供参考,


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

 }


查看完整回答
反对 回复 2023-08-07
  • 3 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信