すべての漢字を抽出

9476 ワード

Unicode 6.012年までのすべての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.大量の漢字は2つのcharで構成されている(いわゆる高代理項と低代理項はDBCS符号化原理と類似している)ので、すべての漢字を処理するには、代理項対の判断が必要である.
3.漢字の一部は、日本、韓国、ベトナムの専用漢字である.
4.漢字が同じ漢字に対応しているが、字形に違いがある字は、字形を保持するために用いられ、一般的には標準字形に変換される漢字が用いられる.