Skip to content

unicode ​

阅读提示

  • 适用版本:Go 1.21+(示例在 Go 1.22 下验证)· 前置知识:语法基础-字符串 · 阅读时长:约 8 分钟

在Go语言开发中,字符串截取是高频操作,尤其涉及中英文混合处理时需特别注意编码问题。本文系统梳理Go语言中4种主流字符串截取方案,结合代码示例解析技术要点。

Unicode安全处理方案 ​

通过[]rune转换实现字符级安全截取:

go
func main() {
    str := "Hello, 世界!"
    runes := []rune(str)
    
    // 字符级安全截取
    sub3 := string(runes[7:9])
    fmt.Println("安全截取中文:", sub3) // 输出: 世界
}

技术对比: ​

方案时间复杂度内存开销适用场景
字节切片O(1)低纯ASCII字符串
[]rune转换O(n)高包含多字节字符的字符串

完整示例 ​

下面的程序可以直接运行:复制到文件后执行 go run main.go,或粘贴到 Go Playground 运行。

go
package main

import (
	"fmt"
	"unicode"
	"unicode/utf8"
)

func main() {
	r := 'G'
	fmt.Println(unicode.IsLetter(r), unicode.IsUpper(r), unicode.ToLower(r))

	cn := '中'
	fmt.Println(unicode.Is(unicode.Han, cn), utf8.RuneLen(cn))

	count := 0
	for _, r := range "a1中!" {
		if unicode.IsLetter(r) {
			count++
		}
	}
	fmt.Println("letters:", count)
}

预期输出:

text
true true 103
true 3
letters: 2

常见错误与踩坑 ​

  • len 是字节数而不是字符数。 字符计数用 utf8.RuneCountInString。
  • 按类别判断,不要比较数值范围。 unicode.Is(unicode.Han, r) 比手写码点区间更可靠。
  • 大小写映射可能变长。 某些 rune 转大写会变成多个字符,长度不保证一致。
  • 按字符下标访问要先转 []rune。 []rune(s)[i] 得到的才是第 i 个字符。
  • utf8 负责边界校验。 逐字符遍历字符串时 utf8.DecodeRuneInString 最安全。

更新记录 ​

  • 2026-10-14:新增"阅读提示"、完整可运行示例(含预期输出)、常见错误与踩坑清单,以及本更新记录。