提取至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.兼容漢字爲相同的漢字但字形有區別的字,用於保留字形,一般使用時會轉換爲標準字形的漢字。