银河

SKYIV STUDIO

  博客园 :: 首页 :: 博问 :: 闪存 :: :: :: 订阅 订阅 :: 管理 ::

引言

我前几天写了一篇随笔“随机生成常用汉字(再次改进版)”。园友“菜菜灰”评论说“看着太累,不认识的字还是多,代码也很多,几段代码显示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. 维基百科: 中日韩越统一表意文字
posted on 2012-12-25 10:25  银河  阅读(3909)  评论(8编辑  收藏  举报