之前在幫小女命名時,在那算著筆劃,有時還跟老婆算的不一樣,最後乾脆上網直接算,而這之後就對這很好奇,究竟程式是怎麼去算筆劃的?怎麼用.Net的C#去實作?
之前在幫小女命名時,在那算著筆劃,有時還跟老婆算的不一樣,最後乾脆上網直接算,而這之後就對這很好奇,究竟程式是怎麼去算筆劃的?怎麼用.Net的C#去實作?
有這想法時,腦海突然浮現出"倚天中文",這個高中時期的中文系統,當時在DOS的環境下,中文就靠它了,那時買的時候有送一本書,依稀的記得裡面似乎有什麼附表,除了ASCII外,還有一堆有的沒的,但它已經被我拿去資源回收了,拜網路之賜,還是可以找的到它的相關資料,搜尋一下"倚天中文字型筆劃順序內碼對照表",就可以看到它的Hex對應的筆劃是多少.
以下這個Class就是將傳入的文字,回傳它的筆劃.
class WordCode
{
public int GetWordCnt(string strWord)
{
byte[] strBig5 = System.Text.Encoding.Convert(System.Text.Encoding.Default, System.Text.Encoding.GetEncoding("big5"), System.Text.Encoding.Default.GetBytes(strWord));
return WordDict(strBig5);
}
/// <summary>
/// 取得筆劃
/// </summary>
/// <param name="intCode">byte</param>
/// <returns>筆劃</returns>
private int WordDict(byte[] intCode)
{
int iCode = Convert.ToInt32(BitConverter.ToString(intCode).Replace("-", string.Empty), 16);
if (iCode >= GetCode("A440") && iCode <= GetCode("A441"))
{
return 1;
}
else if ((iCode >= GetCode("A442") && iCode <= GetCode("A453"))
|| (iCode >= GetCode("C940") && iCode <= GetCode("C944")))
{
return 2;
}
else if ((iCode >= GetCode("A454") && iCode <= GetCode("A47E"))
|| (iCode >= GetCode("C945") && iCode <= GetCode("C94C")))
{
return 3;
}
else if ((iCode >= GetCode("A4A1") && iCode <= GetCode("A4FD"))
|| (iCode >= GetCode("C94D") && iCode <= GetCode("C95C")))
{
return 4;
}
else if ((iCode >= GetCode("A4FE") && iCode <= GetCode("A5DF"))
|| (iCode >= GetCode("C95D") && iCode <= GetCode("C9AA")))
{
return 5;
}
else if ((iCode >= GetCode("A5E0") && iCode <= GetCode("A6E9"))
|| (iCode >= GetCode("C9AB") && iCode <= GetCode("C959")))
{
return 6;
}
else if ((iCode >= GetCode("A6EA") && iCode <= GetCode("A8C2"))
|| (iCode >= GetCode("CA5A") && iCode <= GetCode("CBB0")))
{
return 7;
}
else if ((iCode >= GetCode("A8C3") && iCode <= GetCode("AB44"))
|| (iCode >= GetCode("CBB1") && iCode <= GetCode("CDDC")))
{
return 8;
}
else if ((iCode >= GetCode("AB45") && iCode <= GetCode("ADBB"))
|| (iCode >= GetCode("CDDD") && iCode <= GetCode("D0C7"))
|| iCode == GetCode("F9DA"))
{
return 9;
}
else if ((iCode >= GetCode("ADBC") && iCode <= GetCode("B0AD"))
|| (iCode >= GetCode("D0C8") && iCode <= GetCode("D44A")))
{
return 10;
}
else if ((iCode >= GetCode("B0AE") && iCode <= GetCode("B3C2"))
|| (iCode >= GetCode("D44B") && iCode <= GetCode("D850")))
{
return 11;
}
else if ((iCode >= GetCode("B3C3") && iCode <= GetCode("B6C3"))
|| (iCode >= GetCode("D851") && iCode <= GetCode("DCB0"))
|| iCode == GetCode("F9DB"))
{
return 12;
}
else if ((iCode >= GetCode("B6C4") && iCode <= GetCode("B9AB"))
|| (iCode >= GetCode("DCB1") && iCode <= GetCode("E0EF"))
|| (iCode >= GetCode("F9D6") && iCode <= GetCode("F9D8")))
{
return 13;
}
else if ((iCode >= GetCode("B9AC") && iCode <= GetCode("BBF4"))
|| (iCode >= GetCode("E0F0") && iCode <= GetCode("E4E5")))
{
return 14;
}
else if ((iCode >= GetCode("BBF5") && iCode <= GetCode("BEA6"))
|| (iCode >= GetCode("E4E6") && iCode <= GetCode("E8F3"))
|| iCode == GetCode("F9DC"))
{
return 15;
}
else if ((iCode >= GetCode("BEA7") && iCode <= GetCode("C074"))
|| (iCode >= GetCode("E8F4") && iCode <= GetCode("ECB8"))
|| iCode == GetCode("F9D9"))
{
return 16;
}
else if ((iCode >= GetCode("C075") && iCode <= GetCode("C24E"))
|| (iCode >= GetCode("ECB9") && iCode <= GetCode("EFB6")))
{
return 17;
}
else if ((iCode >= GetCode("C24F") && iCode <= GetCode("C35E"))
|| (iCode >= GetCode("EFB7") && iCode <= GetCode("F1EA")))
{
return 18;
}
else if ((iCode >= GetCode("C35F") && iCode <= GetCode("C454"))
|| (iCode >= GetCode("F1EB") && iCode <= GetCode("F3FC")))
{
return 19;
}
else if ((iCode >= GetCode("C455") && iCode <= GetCode("C4D6"))
|| (iCode >= GetCode("F3FD") && iCode <= GetCode("F5BF")))
{
return 20;
}
else if ((iCode >= GetCode("C3D7") && iCode <= GetCode("C56A"))
|| (iCode >= GetCode("F5C0") && iCode <= GetCode("F6D5")))
{
return 21;
}
else if ((iCode >= GetCode("C56B") && iCode <= GetCode("C5C7"))
|| (iCode >= GetCode("F6D6") && iCode <= GetCode("F7CF")))
{
return 22;
}
else if ((iCode >= GetCode("C5C8") && iCode <= GetCode("C5C7"))
|| (iCode >= GetCode("F6D6") && iCode <= GetCode("F7CF")))
{
return 23;
}
else if ((iCode >= GetCode("C5F1") && iCode <= GetCode("C654"))
|| (iCode >= GetCode("F8A5") && iCode <= GetCode("F8ED")))
{
return 24;
}
else if ((iCode >= GetCode("C655") && iCode <= GetCode("C664"))
|| (iCode >= GetCode("F8E9") && iCode <= GetCode("F96A")))
{
return 25;
}
else if ((iCode >= GetCode("C665") && iCode <= GetCode("C66B"))
|| (iCode >= GetCode("F96B") && iCode <= GetCode("F9A1")))
{
return 26;
}
else if ((iCode >= GetCode("C66C") && iCode <= GetCode("C675"))
|| (iCode >= GetCode("F9A2") && iCode <= GetCode("F9B9")))
{
return 27;
}
else if ((iCode >= GetCode("C676") && iCode <= GetCode("C67A"))
|| (iCode >= GetCode("F9BA") && iCode <= GetCode("F9C5")))
{
return 28;
}
else if ((iCode >= GetCode("C67B") && iCode <= GetCode("C67E"))
|| (iCode >= GetCode("F9C6") && iCode <= GetCode("F9DC")))
{
return 29;
}
else
{
return 0;
}
}
private int GetCode(string iCode)
{
return Convert.ToInt32(iCode, 16);
}
}
最後只要直接呼叫這個Class的GetWordCnt即可一一取得筆劃.
StringBuilder sb = new StringBuilder();
textBox1.Text = textBox1.Text.Trim();
WordCode wc = new WordCode();
foreach (char c in textBox1.Text)
{
sb.AppendFormat("{0}{1}\r\n", c, wc.GetWordCnt(c.ToString()));
}
richTextBox1.Text = sb.ToString();
執行範例
一些難字我沒有把它列進去,因為邏輯一樣,有興趣的人就自己再動點功夫就好了~