
Go 中直接按字节切片字符串会导致 UTF-8 编码损坏;正确做法是先转为 []rune 按字符长度截取,再去除尾部空格并添加省略号,确保多语言文本(如捷克语、中文)截取结果合法且语义完整。
go 中直接按字节切片字符串会导致 utf-8 编码损坏;正确做法是先转为 `[]rune` 按字符长度截取,再去除尾部空格并添加省略号,确保多语言文本(如捷克语、中文)截取结果合法且语义完整。
在 Go 语言中,string 类型底层是只读的 UTF-8 编码字节序列,len(s) 返回的是字节数而非字符数。因此,像 s[0:n] 这样的切片操作极易在多字节 Unicode 字符(如 č、ř、你好)中间截断,产生非法 UTF-8 序列——这正是 prettyCrop("čřč čřč", 8) 返回 čř?… 的根本原因:字节索引 8 落在某个 UTF-8 多字节字符的中间,导致解码失败。
✅ 正确方案:以 rune(Unicode 码点)为单位操作,确保字符边界对齐:
range
-
cropLength始终表示字符数(rune 数),不是字节数,请在文档中明确说明; - 若需保留单词完整性(如不截断单词中间),应进一步结合
strings.Fields或正则实现“智能断行”; - 在 Web 或日志等对性能敏感场景,优先使用
prettyCropOptimized; - 所有返回字符串均保证 UTF-8 合法性,可安全用于 HTML 渲染、JSON 序列化等。
通过 rune 层级操作,你不仅能解决东欧字符问题,还能无缝支持中文、日文、阿拉伯文等全部 Unicode 文本——这是 Go 处理国际化字符串的基石实践。










