Golang strconv.IsPrint
最后修改于 2025 年 4 月 20 日
本教程将介绍如何在 Go 中使用 strconv.IsPrint 函数。我们将通过实际示例讲解可打印字符的检查。
strconv.IsPrint 函数用于检查一个 rune 是否是可打印的。当一个 rune 在 Go 的 Unicode 表中被定义为可打印时,它就被认为是可打印的。
可打印字符包括字母、数字、标点符号、符号以及 ASCII 空格字符。控制字符和其他不可见 rune 不被认为是可打印的。
基本的 strconv.IsPrint 示例
strconv.IsPrint 最简单的用法是检查一个 rune 是否是可打印的。这里我们演示了检查各种 rune。
package main
import (
"fmt"
"strconv"
)
func main() {
runes := []rune{'A', ' ', '\n', '€', '\t'}
for _, r := range runes {
if strconv.IsPrint(r) {
fmt.Printf("%U '%c' is printable\n", r, r)
} else {
fmt.Printf("%U is not printable\n", r)
}
}
}
我们测试了几个 rune,包括字母、空格、换行符、欧元符号和制表符。该函数根据 Go 的 Unicode 表正确地识别了哪些 rune 是可打印的。
检查字符串字符
strconv.IsPrint 可以检查字符串中的每个字符。此示例演示了如何验证整个字符串的可打印性。
package main
import (
"fmt"
"strconv"
)
func main() {
str := "Hello\tWorld\n"
for i, r := range str {
if strconv.IsPrint(r) {
fmt.Printf("Character %d: '%c' is printable\n", i, r)
} else {
fmt.Printf("Character %d: %U is not printable\n", i, r)
}
}
}
我们遍历字符串中的每个 rune 并检查其可打印性。制表符和换行符被正确识别为不可打印字符。
过滤不可打印字符
此示例演示了如何使用 strconv.IsPrint 从字符串中过滤掉不可打印字符。
package main
import (
"fmt"
"strconv"
)
func main() {
input := "Hello\x07World\x1B[31m"
var output []rune
for _, r := range input {
if strconv.IsPrint(r) {
output = append(output, r)
}
}
fmt.Println("Original:", input)
fmt.Println("Filtered:", string(output))
}
我们从字符串中移除了不可打印字符(响铃符和 ANSI 转义序列)。过滤后的结果仅包含可打印字符。
与 unicode.IsPrint 比较
Go 的 unicode 包中有一个类似的函数。此示例将 strconv.IsPrint 与 unicode.IsPrint 进行比较。
package main
import (
"fmt"
"strconv"
"unicode"
)
func main() {
runes := []rune{'A', '\n', ' ', '€', '\x7f'}
for _, r := range runes {
sp := strconv.IsPrint(r)
up := unicode.IsPrint(r)
fmt.Printf("%U: strconv.IsPrint=%t, unicode.IsPrint=%t\n",
r, sp, up)
}
}
这两个函数在大多数情况下是等效的,但在某些边缘情况下可能有所不同。两者都认为空格是可打印的,而控制字符是不可打印的。
验证用户输入
此示例展示了如何使用 strconv.IsPrint 来验证用户输入是否仅包含可打印字符。
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter text: ")
input, _ := reader.ReadString('\n')
input = strings.TrimSpace(input)
for i, r := range input {
if !strconv.IsPrint(r) {
fmt.Printf("Invalid character at position %d: %U\n", i, r)
return
}
}
fmt.Println("Input is valid:", input)
}
我们读取用户输入并检查每个字符的可打印性。程序会拒绝包含任何不可打印字符的输入。
处理多字节字符
strconv.IsPrint 可以正确处理多字节 Unicode 字符。此示例演示了如何检查各种 Unicode 字符。
package main
import (
"fmt"
"strconv"
)
func main() {
chars := []rune{
'A', // ASCII
'é', // Latin-1 Supplement
'你', // CJK Unified Ideographs
'\u2028', // Line Separator
'\U0001F600', // Emoji
}
for _, r := range chars {
fmt.Printf("%U '%c': %t\n", r, r, strconv.IsPrint(r))
}
}
该函数能够正确识别 ASCII、带重音字符、CJK 汉字和表情符号的可打印性。行分隔符被正确标记为不可打印。
实际示例:日志清理
这个实际示例演示了如何使用 strconv.IsPrint 通过替换不可打印字符来清理日志消息。
package main
import (
"fmt"
"strconv"
"strings"
)
func sanitizeLog(msg string) string {
var b strings.Builder
for _, r := range msg {
if strconv.IsPrint(r) {
b.WriteRune(r)
} else {
b.WriteString(fmt.Sprintf("\\x%02x", r))
}
}
return b.String()
}
func main() {
logMsg := "User\x07 tried to access \x1B[31mrestricted\x1B[0m area"
fmt.Println("Original log:", logMsg)
fmt.Println("Sanitized log:", sanitizeLog(logMsg))
}
我们将不可打印字符替换为它们的十六进制转义序列。这使得日志更安全、更易读,同时保留了原始信息。
来源
本教程通过各种场景下的可打印字符检查的实际示例,涵盖了 Go 中的 strconv.IsPrint 函数。