Golang字符串处理工具 - Stringwrap(支持Unicode、ANSI和表情符号)
Golang字符串处理工具 - Stringwrap(支持Unicode、ANSI和表情符号)
虽然距离初版发布已过去一个半月,我发布得有点晚,但我刚刚发布了 stringwrap 的 v1.0.4 版本。这是一个小型库,旨在解决在终端和 TUI 中处理文本换行的棘手问题:
- 支持字形簇: 永远不会拆分 👩💻、国旗或组合标记序列。
- 真实的显示宽度: 使用
go-runewidth,能正确处理全角 CJK 字符、窄空格等。 - 兼容 ANSI 转义码: 保留转义码,但其不计入宽度。
- 制表符、修剪、单词分割: 可选择保留或修剪首尾空白字符、展开制表符、安全地对长单词进行连字符分割。
- 丰富的元数据: 除了其他元数据外,每个换行后的行都附带指向原始字符串的字节/符文偏移量。
Repo & docs
- GitHub: GitHub - galactixx/stringwrap: Stringwrap 是一个 Go 包,用于按视觉宽度包装字符串,支持可选的单词分割以及完整的 ANSI 转义码和字形簇支持。专为精确换行设计,非常适合终端输出、格式化日志或需要每行段精确元数据的编辑器。
go getgithub.com/galactixx/stringwrap@v1.0.4- 完整更新日志请查看发布页面。
非常欢迎反馈、错误报告,或关于诸如基于流的换行等改进功能的想法。感谢关注! 🙏
更多关于Golang字符串处理工具 - Stringwrap(支持Unicode、ANSI和表情符号)的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于Golang字符串处理工具 - Stringwrap(支持Unicode、ANSI和表情符号)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
stringwrap v1.0.4 确实解决了终端文本处理中的几个关键痛点。字形簇和ANSI转义码的支持特别实用,这在处理国际化内容和彩色输出时是必须的。
下面是一个基本使用示例:
package main
import (
"fmt"
"github.com/galactixx/stringwrap"
)
func main() {
text := "Hello 👩💻世界!\x1b[31m红色文本\x1b[0m"
// 创建包装器,设置宽度为10
wrapper := stringwrap.NewWrapper(stringwrap.WithWidth(10))
// 执行换行
lines, err := wrapper.Wrap(text)
if err != nil {
panic(err)
}
// 输出结果
for _, line := range lines {
fmt.Printf("Line: %q\n", line.Text)
fmt.Printf(" Byte offset: %d, Rune offset: %d\n",
line.ByteOffset, line.RuneOffset)
}
}
对于需要处理制表符和单词分割的场景:
wrapper := stringwrap.NewWrapper(
stringwrap.WithWidth(20),
stringwrap.WithExpandTabs(true), // 展开制表符
stringwrap.WithWordBreak(true), // 启用单词分割
stringwrap.WithTrimSpace(true), // 修剪空白
)
lines, _ := wrapper.Wrap("这是一个很长的单词:antidisestablishmentarianism")
元数据功能在需要精确定位原始字符串位置时很有用,比如在构建编辑器或日志分析工具时。字节和符文偏移量可以直接用于后续处理。
包的设计考虑了扩展性,通过选项模式配置包装行为很清晰。如果后续能添加对双向文本(bidi)的支持会更有价值,这在混合语言环境中很重要。

