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:新增"阅读提示"、完整可运行示例(含预期输出)、常见错误与踩坑清单,以及本更新记录。
