最准确方式是用unicode.is(unicode.scripts["han"], r)判断单个rune,它覆盖中日韩越共用汉字及扩展a/b/c/d/e区,而unicode.isletter对汉字返回false因其属lo类别,硬编码[\u4e00-\u9fa5]则严重漏字。

直接用 unicode.Is(unicode.Scripts["Han"], r) 判断单个 rune,这是目前最准、最省心的方式。别信 unicode.IsLetter 或硬编码 [\u4e00-\u9fa5] —— 前者对中文返回 false,后者漏字严重,连“〇”“〆”“々”都匹配不到。
为什么 unicode.IsLetter 对中文返回 false
因为 unicode.IsLetter 只识别 Unicode 字母子类(Ll、Lu、Lt 等),而汉字属于 Lo(Letter, other)类别,压根不在它的判定范围内。这不是 bug,是标准定义如此。
想兼容中日韩文字,必须用 unicode.Is(unicode.Letter, r)(注意是 unicode.Letter 这个类别常量,不是函数名);但若目标明确是“汉字”,就得切到脚本维度。
-
unicode.Is(unicode.Letter, r):覆盖所有语言的字母,包括中文、平假名、片假名、谚文、emoji 字母等 -
unicode.Is(unicode.Scripts["Han"], r):只认 Han 脚本字符,即真正意义上的汉字(含中日韩越共用字、扩展 A/B/C/D/E 区) -
unicode.IsHan()不存在 —— 标准库没这个函数,搜到的都是错的或第三方包
正则匹配中文为什么总漏字
Go 的 regexp 基于 RE2 引擎,不支持 \p{Han} 这类 Unicode 属性类。网上流传的 [\u4e00-\u9fa5] 实际只覆盖基本汉字区,漏掉:
- 扩展 A 区(U+3400–U+4DBF):“?”、“㐂”
- 兼容汉字(U+F900–U+FAFF):“乂”、“亍”
- 全角标点(U+3000–U+303F):“ ”、“〄”、“〆”
- 中文数字“〇”(U+3007)
如果非要用正则,至少写成:[\u4e00-\u9fff\u3400-\u4dbf\uf900-\ufaff\u3000-\u303f\uff00-\uffef],但依然不是“所有汉字”的解法。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
判断字符串是否含中文 or 全是中文
核心逻辑都是遍历 rune,别用 for i := range s 拿 byte 下标,也别用 strings.Index 配正则——既慢又不准。
含中文:
func containsChinese(s string) bool {
for _, r := range s {
if unicode.Is(unicode.Scripts["Han"], r) {
return true
}
}
return false
}
全是中文:
func isAllChinese(s string) bool {
if s == "" {
return false // 或按需返回 true
}
for _, r := range s {
if !unicode.Is(unicode.Scripts["Han"], r) {
return false
}
}
return true
}
- 空字符串要显式处理,
len(s) == 0或s == ""才可靠;utf8.RuneCountInString(s) == 0是错的 - 性能上,对几千字符以内的文本,
unicode.Is开销可忽略;百万级文本建议先用粗略正则过滤再细判 - 如果输入可能含非法 UTF-8(比如从 GBK 文件读取未转码),先调
utf8.ValidString(s),否则range和unicode.Is都会出问题
容易被忽略的边界情况
真正上线时踩坑最多的不是逻辑,而是环境和数据源头:
- 文件读取:GBK 编码的 txt 直接
os.ReadFile后当string传入,会导致regexp.Compile报invalid UTF-8,且range行为异常 - 终端输出:Windows cmd 默认代码页不是 UTF-8,
fmt.Println("中文")可能显示乱码,但这不影响内部判断逻辑 - 全角空格:
strings.TrimSpace对 U+3000( )完全无效,需手动替换或用unicode.IsSpace清洗 - Go 版本:
unicode.Scripts["Han"]在 Go 1.19+ 才完整覆盖扩展汉字区,旧版本可能漏判部分生僻字
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










