在Go中删除字符串中的不可打印字符的方法

2,161 阅读1分钟

在处理外部文件或用户输入时,删除可能导致问题的不可见字符通常是个好主意。这些字符是 "不可打印的"--它们在打印时不占空间,属于 OtherSeparator类别中的 Unicode标准中的或类别。例如,不可打印的是:

  • 白色空格(ASCII空格字符除外)
  • 选项卡
  • 换行
  • 回车键
  • 控制字符

要从Go中的字符串中删除不可打印的字符,你应该遍历该字符串并使用 unicode.IsPrint()函数检查某个符文是否可以打印。如果不是,该符文应被忽略,否则应将其添加到新的字符串中。

与其在for 循环中迭代并手动创建一个新的字符串,你可以使用strings.Map() ,它返回一个字符串的副本,并根据映射函数修改所有字符。最好的部分是,如果映射函数对给定的符文返回一个负值,那么这个字符就会被放弃。因此,我们可以对一个不可打印的字符返回-1 ,如果映射函数返回一个未修改的符文,则返回一个未修改的符文。 unicode.IsPrint()返回true 。请看下面的例子。

package main

import (
    "fmt"
    "strings"
    "unicode"
)

func main() {
    text := "b\u00a0e\u200bhind\n"

    fmt.Println(text)
    fmt.Println(len(text))
    fmt.Println("---")


    text = strings.Map(func(r rune) rune {

        if unicode.IsPrint(r) {

            return r

        }

        return -1

    }, text)


    fmt.Println(text)
    fmt.Println(len(text))
}

输出

b e​hind
12
---
behind
6

unicode.IsPrint()则返回true

  • 字母
  • 标记
  • 数字
  • 标点符号
  • 符号
  • ASCII空间字符

还有一个函数 unicode.IsGraphic(),其工作原理几乎相同,只是它对所有空格字符的类别中的 ZsUnicode标准。