golang 计算字符串(含中文)长度的常用方法

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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值