Go 标准库不支持全角到半角字符的转换,但可通过官方扩展包 golang.org/x/text/width 的 width.Narrow 转换器高效实现全角数字(如“123”)到 ASCII 数字(如“123”)的标准化处理。
go 标准库不支持全角到半角字符的转换,但可通过官方扩展包 `golang.org/x/text/width` 的 `width.narrow` 转换器高效实现全角数字(如“123”)到 ascii 数字(如“123”)的标准化处理。
在 Go 中处理用户输入或外部数据时,常会遇到全角字符(尤其是东亚语言环境下输入的全角数字、字母或标点),例如 "123"、"ABC" 或 ",。!"。这些字符虽视觉上类似 ASCII 字符,但在 Unicode 中属于不同码点(如全角数字 0 的码点是 U+FF10,而 ASCII 0 是 U+0030),无法直接参与数值计算或字符串比较。
Go 标准库 strings 和 unicode 包均未提供全角→半角的转换功能。但官方维护的扩展库 golang.org/x/text 提供了健壮的国际化文本处理能力,其中 golang.org/x/text/width 包的 width.Narrow 变换器专用于将全宽(Full-width)字符映射为对应的窄宽(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)
// 支持混合内容(含字母、标点)
mixed := "abc123,.!"
fmt.Printf("混合转换: %q → %q\n", mixed, convert(mixed))
}输出:
输入: "123" → 输出: "123" 验证成功: true 混合转换: "abc123,.!" → "abc123,.!"
⚠️ 注意事项:
- 需先安装依赖:go get golang.org/x/text(推荐使用 Go Modules 管理);
- width.Narrow 是无损、幂等的:多次调用结果一致,且对已为半角的字符无影响;
- 它仅转换 Unicode 定义中明确对应窄形的全角字符(如 U+FF10–U+FF19 → U+0030–U+0039),不会修改汉字、平假名、片假名等非拉丁字符;
- 如需更精细控制(如仅转换数字、保留全角标点),需自行实现 rune 映射逻辑,但多数场景下 width.Narrow 已足够健壮与高效。
综上,golang.org/x/text/width.Narrow 是 Go 生态中处理全角字符转换的事实标准方案,简洁、可靠、符合 Unicode 规范,应作为首选。

















