package main
import (
"fmt"
"github.com/mattn/go-runewidth"
"regexp"
"unicode/utf8"
)
var stripAnsiEscapeRegexp = regexp.MustCompile(`(\x9B|\x1B\[)[0-?]*[ -/]*[@-~]`)
func stripAnsiEscape(s string) string {
return stripAnsiEscapeRegexp.ReplaceAllString(s, "")
}
func realLength(s string) int {
return runewidth.StringWidth(stripAnsiEscape(s))
}
func main() {
test1 := "1234567890\t"
test2 := "1测试长度3\t"
fmt.Println("字符串长度,包括控制码,一个汉字长度3")
fmt.Printf("str = %q \tlen(str) = %d\r\n", test1, len(test1))
fmt.Printf("str = %q \tlen(str) = %d\r\n", test2, len(test2))
fmt.Println()
fmt.Println("字符串长度,包括控制码,一个汉字长度1")
fmt.Printf("str = %q \tRuneCountInString(str) = %d\r\n", test1, utf8.RuneCountInString(test1))
fmt.Printf("str = %q \tRuneCountInString(str) = %d\r\n", test2, utf8.RuneCountInString(test2))
fmt.Println()
fmt.Println("字符串长度,不包括控制码,一个汉字长度2,常用于计算实际的显示宽度")
fmt.Printf("str = %q \trealLength(str) = %d\r\n", test1, realLength(test1))
fmt.Printf("str = %q \trealLength(str) = %d\r\n", test2, realLength(test2))
}
运行结果:
字符串长度,包括控制码,一个汉字3长度
str = "1234567890\t" len(str) = 11
str = "1测试长度3\t" len(str) = 15
字符串长度,包括控制码,一个汉字1长度
str = "1234567890\t" RuneCountInString(str) = 11
str = "1测试长度3\t" RuneCountInString(str) = 7
字符串长度,不包括控制码,一个汉字2长度,真实的显示宽度
str = "1234567890\t" realLength(str) = 10
str = "1测试长度3\t" realLength(str) = 10
该代码示例展示了如何处理ANSI转义码并计算字符串的实际显示宽度。`stripAnsiEscape`函数用于移除ANSI转义码,`realLength`函数则计算不包含控制码的字符串宽度。程序分别展示了原始长度、考虑控制码的长度以及去除控制码后的长度,对于含有汉字的字符串,不同计算方式下长度的变化。
1万+

被折叠的 条评论
为什么被折叠?



