zoukankan      html  css  js  c++  java
  • 提取所有汉字

    提取至Unicode 6.0,2012年为止的所有CJK汉字(合计75617个)

        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                StringBuilder sbAllHans = new StringBuilder(124000);
                InitializeComponent();
                //0x3400 - 0x4DB5       // 统一汉字扩展区A,6582字
                CreateData(sbAllHans, 0x3400, 0x4DB5, "A");
                //0x4E00 - 0x9FCC       // 统一汉字基本集,20941字
                CreateData(sbAllHans, 0x4E00, 0x9FCC, "M");
                //0xF900 - 0xFA2D       // 兼容汉字(1),302字
                CreateData(sbAllHans, 0xF900, 0xFA2D, "1");
                //0xFA30 - 0xFA6D       // 兼容汉字(2),62字
                CreateData(sbAllHans, 0xFA30, 0xFA6D, "2");
                //0xFA70 - 0xFAD9       // 兼容汉字(3),106字
                CreateData(sbAllHans, 0xFA70, 0xFAD9, "3");
                //0x20000 - 0x2A6D6     // 统一汉字扩展区B,42711字
                CreateData(sbAllHans, 0x20000, 0x2A6D6, "B");
                //0x2A700 - 0x2B734     // 统一汉字扩展区C,4149字
                CreateData(sbAllHans, 0x2A700, 0x2B734, "C");
                //0x2B740 - 0x2B81D     // 统一汉字扩展区D,222字
                CreateData(sbAllHans, 0x2B740, 0x2B81D, "D");
                //0x2F800 - 0x2FA1D;    // 兼容汉字(4),542字
                CreateData(sbAllHans, 0x2F800, 0x2FA1D, "4");
    
                File.WriteAllText("D:\\AllHans.txt", sbAllHans.ToString());
            }
            private void CreateData(StringBuilder sbAllHans, int from, int to, string type)
            {
                for (int i = from; i <= to; i++)
                {
                    char[] chars = IntToUtf16(i);
    
                    foreach (var one in chars) sbAllHans.Append(one);
                }
    
            }
    
            public static char[] IntToUtf16(int value)
            {
                if (value < 0 || value > 0x10FFFF) throw new ArgumentOutOfRangeException("unicodeValue");
    
                if (value <= char.MaxValue) return new char[] { (char)value };
    
                int vx = value - 0x10000;
                int vHight = vx >> 10;
                //int vLow = vx << 21 >> 21;      //最高位为正负标识为,总是0,如果直接<<22,则会把标识位变成1,从而导致数值变为负数,出错。
                int vLow = vx & 0x03FF;
                int vLow1 = vx << 21 >> 21;
    
                int w1 = 0xD800;
                int w2 = 0xDC00;
    
                w1 |= vHight;
                w2 |= vLow;
    
                return new char[] { (char)w1, (char)w2 };
    
            }
    
        }


    注意:

    1.这些汉字虽然能够全部提取,但是绝大多数的字库是没有全部字体的字形显示的,所以需要安装字库;具体信息请参见汉典的说明(http://www.zdic.net/appendix/f18.htm

    2.有大量的汉字是用两个char组成的(所谓高代理项和低代理项,与DBCS编码原理类似),所以要处理全部的汉字,需要进行代理项对的判断。

    3.汉字中有一部分是日、韩、越专用汉字。

    4.兼容汉字为相同的汉字但字形有区别的字,用于保留字形,一般使用时会转换为标准字形的汉字。

  • 相关阅读:
    天梯赛
    CF#715 div2
    「Solution」C++ 循环结构 阶乘问题
    「ASCII Art」字符画黑人抬棺
    「Solution」P5759 [NOI1997]竞赛排名
    miller_rabin判断质数logn
    Contest 2050 and Codeforces Round #718 (Div. 1 + Div. 2) A B C 题解
    Codeforces Round #717 (Div. 2) A B C 题解
    redis php常用操作
    php7 操作MongoDB
  • 原文地址:https://www.cnblogs.com/yuxs/p/2832255.html
Copyright © 2011-2022 走看看