計算漢字的筆劃

之前在幫小女命名時,在那算著筆劃,有時還跟老婆算的不一樣,最後乾脆上網直接算,而這之後就對這很好奇,究竟程式是怎麼去算筆劃的?怎麼用.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();

執行範例

image

 

一些難字我沒有把它列進去,因為邏輯一樣,有興趣的人就自己再動點功夫就好了~