惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
B
Blog
V
V2EX
T
Tailwind CSS Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
博客园 - 聂微东
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
The Cloudflare Blog
J
Java Code Geeks
H
Help Net Security
雷峰网
雷峰网
Apple Machine Learning Research
Apple Machine Learning Research
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Engineering at Meta
Engineering at Meta
F
Fortinet All Blogs
Martin Fowler
Martin Fowler
D
Docker
L
LangChain Blog
人人都是产品经理
人人都是产品经理
爱范儿
爱范儿
WordPress大学
WordPress大学
V
Visual Studio Blog

博客园 - 银河

表示无向图的的数据类型 计算幂函数的几种方法 浅谈浮点数运算的误差 浅谈 System.Decimal 结构 两种计算自然对数的算法比较 计算自然对数的算法 计算指数函数的算法 计算自然对数的快速算法 第N个素数的渐近公式 浅谈 System.Linq.Enumerable.AsEnumerable 方法 在键值表中寻找最大值的键 浅谈中日韩越统一表意文字 统计中文文本中常用字占比 随机生成常用汉字(再次改进版) 随机生成常用汉字(改进版) 谈谈 .NET Reflector 现代汉语常用字与国标一级字的比较 微软的必应搜索引擎出现故障 绝妙的取样
浅谈 GB13000
银河 · 2012-12-25 · via 博客园 - 银河

引言

我前几天写了一篇随笔“随机生成常用汉字(再次改进版)”。园友“菜菜灰”评论说“看着太累,不认识的字还是多,代码也很多,几段代码显示2万多汉字”,并给出了相应的 C# 代码:

1 System.Text.StringBuilder sb = new System.Text.StringBuilder();
2 sb.Append("<hr />");
3 for (int i = 19968; i < 40869; i++)
4 {
5     sb.Append(((char)i).ToString());
6 }
7 sb.Append("<hr />");
8 Response.Write(sb.ToString());

上述代码给出了 20,901 个汉字。

GB 13000 的字符集包含 20,902 个汉字,其 Unicode 编码从 0x4E00 到 0x9FA5,即从 19,968 到 40,869。所以上述代码有点小问题,第3行的“<”应改为“<=”。另外第5行的 ToString() 也是多余的,直接改为 sb.Append((char)i); 就行了。

生成 GB13000 字符集的 C# 程序

下面就是经过修改后的 C# 程序:

 1 using System;
 2 using System.Text;
 3 
 4 sealed class GB13000Creator
 5 {
 6   static void Main()
 7   {
 8     Console.WriteLine(GetGB13000String());
 9   }
10 
11   static string GetGB13000String()
12   {
13     var sb = new StringBuilder();
14     for (var i = 19968; i <= 40869; i++) sb.Append((char)i);
15     return sb.ToString();
16   }
17 }

其实,以下程序也实现完全相同的功能:

 1 using System;
 2 
 3 sealed class GB13000Creator
 4 {
 5   static void Main()
 6   {
 7     Console.WriteLine(GetGB13000String());
 8   }
 9 
10   static string GetGB13000String()
11   {
12     var gb = new char[20902] ;
13     for (var i = 0; i < gb.Length; i++) gb[i] = (char)(i + 19968);
14     return new string(gb);
15   }
16 }

这个程序应该比前一个运行速度快点儿。

编译和运行

在 Arch Linux 的 Mono 2.10.8 环境下编译和运行:

work$ dmcs GB13000Creator.cs && mono GB13000Creator.exe
一丁丂七丄丅丆万丈三上下丌不与丏丐丑丒专 ... 龒龓龔龕龖龗龘龙龚龛龜龝龞龟龠龡龢龣龤龥

上述运行结果就是 GB 13000 字符集的 20,902 个汉字。

进一步的说明

其实 GB 13000 这个国家标准已经有点过时了,现行的国家标准是 GB 18030,全称:国家标准 GB 18030-2005《信息技术 中文编码字符集》,是中华人民共和国现时最新的内码字集,是GB 18030-2000《信息技术 信息交换用汉字编码字符集 基本集的扩充》的修订版。与 GB 2312-1980 完全兼容,与 GBK 基本兼容,支持 GB 13000 及 Unicode 的全部统一汉字,共收录汉字 70,244 个。本规格的初版是由中华人民共和国信息产业部电子工业标准化研究所起草,由国家质量技术监督局于2000年3月17日发布。现行版本为国家质量监督检验总局和中国国家标准化管理委员会于2005年11月8日发布,2006年5月1日实施。此规格为在中国境内所有软件产品支持的强制规格。

不知道有没有简单的方法生成 GB 18030 规定的这 70,244 个汉字?

参考资料

  1. 维基百科: 汉字内码扩展规范
  2. 维基百科: GB 13000
  3. 维基百科: GB 18030
  4. 维基百科: 中日韩越统一表意文字