在处理外部文件或用户输入时,删除可能导致问题的不可见字符通常是个好主意。这些字符是 "不可打印的"--它们在打印时不占空间,属于 Other或 Separator类别中的 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 ehind
12
---
behind
6
该 unicode.IsPrint()则返回true 。
- 字母
- 标记
- 数字
- 标点符号
- 符号
- ASCII空间字符
还有一个函数 unicode.IsGraphic(),其工作原理几乎相同,只是它对所有空格字符的类别中的 Zs的 Unicode标准。