如何查看 Unicode 字符类别的全部字符

20次阅读

如何查看 Unicode 字符类别的全部字符

go 标准库未在文档中直接列出 unic++ode 类别(如标点符号 p、组合字符 m)所包含的所有字符,但可通过解析 `unicode` 包源码中的 `rangetable` 结构,遍历并打印对应码点范围内的全部字符。

go 的 unicode 包(如 unicode.Punct、unicode.Mark)底层使用 *unicode.RangeTable 类型表示字符类别,该结构由多个连续码点范围(Range16 和 Range32)构成,涵盖 Unicode 标准中定义的全部字符。虽然官方文档(如 unicode.IsPunct)仅说明“判断是否属于某类别”,并未提供完整字符列表,但其实现细节完全公开——位于 Go 源码的 src/unicode/tables.go 文件中。

要获取某一类别(如 P —— Unicode 类别 Punctuation)的所有字符,可直接遍历其 R16 和 R32 字段:

package main  import (     "fmt"     "unicode" )  func printAllPunct() {     // 遍历 16-bit 范围(U+0000–U+FFFF)     for _, r := range unicode.Punct.R16 {         for c := r.Lo; c <= r.Hi; c += r.Stride {             fmt.Printf("%U ", c)         }     }     // 遍历 32-bit 范围(U+10000 及以上)     for _, r := range unicode.Punct.R32 {         for c := r.Lo; c <= r.Hi; c += r.Stride {             fmt.Printf("%U ", c)         }     }     fmt.Println() }  func main() {     printAllPunct() }

⚠️ 注意事项:

  • Stride 通常为 1,但某些特殊范围(如全角 ASCII 符号映射)可能为其他值,务必按步长递增,不可简单 c++
  • 输出为 Unicode 码点(如 U+0021),可用 String(c) 转为可读字符(注意:部分字符需 UTF-8 环境支持显示);
  • unicode.Mark(类别 M,含重音、变音等组合字符)同样适用此方法,只需替换为 unicode.Mark;
  • 此方式依赖 Go 标准库内置的 Unicode 数据(当前同步至 Unicode 15.1),版本升级后范围可能变化,建议结合 go version 和 unicode.Version(若存在)校验兼容性。

综上,虽无“一键文档列表”,但借助 Go 语言透明的实现机制与标准库的可编程性,开发者可精准、高效地提取任意 Unicode 类别的全部字符,适用于测试、调试或构建字符白名单等实际场景。

text=ZqhQzanResources