Go 标准库不支持全角到半角字符的转换,但可借助官方扩展包 golang.org/x/text/width 中的 width.Narrow 转换器高效完成全角数字(如“123”)到 ASCII 数字(“123”)的标准化处理。
go 标准库不支持全角到半角字符的转换,但可借助官方扩展包 `golang.org/x/text/width` 中的 `width.narrow` 转换器高效完成全角数字(如“123”)到 ascii 数字(“123”)的标准化处理。
在 Go 中处理用户输入或国际化文本时,常会遇到全角数字(如 Unicode 全宽数字 U+FF10–U+FF19:0123456789),这类字符虽视觉上类似 ASCII 数字,但编码不同(UTF-8 编码长度、Unicode 码点均不一致),无法直接参与数值计算或字符串比较。标准库 strings 和 unicode 包均未提供全角→半角的规范化功能,因此需依赖官方维护的扩展库 golang.org/x/text。
推荐使用 golang.org/x/text/width 包中的 width.Narrow 变换器,它专为将全宽(Fullwidth)字符(包括数字、拉丁字母、标点等)映射为对应的窄宽(Narrow / ASCII 兼容)形式而设计,语义准确且经过充分测试。
以下是一个完整、可运行的示例:
package main
import (
"fmt"
"golang.org/x/text/width"
)
func convert(input string) string {
return width.Narrow.String(input)
}
func main() {
fullWidth := "123"
expected := "123"
result := convert(fullWidth)
fmt.Printf("输入:%q → 输出:%q\n", fullWidth, result)
fmt.Printf("验证:%t\n", result == expected)
// 查看 Unicode 码点对比(辅助调试)
fmt.Printf("原字符串码点:%U\n", []rune(fullWidth)) // [U+FF11 U+FF12 U+FF13]
fmt.Printf("转换后码点:%U\n", []rune(result)) // [U+0031 U+0032 U+0033]
}✅ 输出结果:
输入:"123" → 输出:"123" 验证:true 原字符串码点:[U+FF11 U+FF12 U+FF13] 转换后码点:[U+0031 U+0032 U+0033]
⚠️ 注意事项:
- 需先安装依赖:go get golang.org/x/text/width
- width.Narrow 不仅处理数字,还会转换全角英文字母(如 ABC → ABC)和常见标点(如 , → ,),若只需处理数字,该行为仍安全且符合常规文本归一化需求;
- 该转换是单向的(全角→半角),不可逆;如需保留原始格式,请在转换前备份;
- width.Narrow.String() 内部基于 transform.Reader 实现,性能良好,适用于高频调用场景。
总结:虽然 Go 标准库未内置全角字符处理能力,但 golang.org/x/text/width 作为官方推荐的国际化文本处理子库,提供了可靠、简洁且符合 Unicode 标准的解决方案——一行调用 width.Narrow.String(s) 即可完成从 “123” 到 “123” 的精准转换,是生产环境中的首选实践。

















