幫 漢字 後括號的平假名換個格式

如果有逛我另一個 blog 就知道我還蠻常放日文歌的
那日文歌漢字的部份通常會有假名來輔助
而我又不習慣他就在後面括號出現,而是習慣以 <span title="..."> 的形式括住它
並撰寫一個 JavaScript 讓習慣假名在後面以括號形式出現的按個按鍵就能轉換成該形式

那每次都手動一個一個改,雖然有 notepad++ 的輔助,其實還蠻快的
但我仍覺是十分浪費時間的動作,所以我就在想了,是否能透過程式來輔助呢?
所以就有了這篇文章的參生了

using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace DMSolution.WinForm1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var sb = new StringBuilder(textBox1.Text.Length * 2);
            var loc = textBox1.Text.IndexOf("(");
            var loc_end = textBox1.Text.IndexOf(")");
            int i = 0, lastChar = 0;
            while (loc >= 0 && loc_end >= 0)
            {
                for (i = loc - 1; i >= 0; i--)
                {
                    var tmp = textBox1.Text[i];
                    var c = Convert.ToInt32(tmp);
                    if (!((c >= 0x3400 && c <= 0x4DFF) ||
                          (c >= 0x4E00 && c <= 0x9FFF) ||
                          (c >= 0xF900 && c <= 0xFAFF)))
                    {
                        break;
                    }
                }
                if (i > 0)
                {
                    sb.Append(textBox1.Text.Substring(lastChar, i - lastChar));
                }
                sb.AppendFormat("<span title=\"{1}\">{0}</span>",
                    textBox1.Text.Substring(i + 1, loc - i - 1),
                    textBox1.Text.Substring(loc + 1, loc_end - loc - 1));
                lastChar = loc_end + 1;
                loc = textBox1.Text.IndexOf("(", loc_end + 1);
                loc_end = textBox1.Text.IndexOf(")", loc_end + 1);
            }
            if (i > 0)
            {
                sb.Append(textBox1.Text.Substring(lastChar));
            }
            textBox1.Text = sb.ToString();
        }
    }
}

那其中看到 0x3400, 0x4DFF, 0x4E00, 0x9FFF, 0xF900, 0xFAFF 這些十六進位碼,他們作的動作是找出漢字,如果不在這範圍內,那他們就不是漢字了,那些值是參考 [1] 得來的
那我曾經想過用 Regular Expressions 來處理並使用取代,但我不太知道該怎一次判斷三個區隔來取代,所以我只好改成用笨笨的迴圈方式


Reference:

留言

這個網誌中的熱門文章

DB 資料庫呈現復原中

Outlook 刪除大量重覆信件

[VB.Net] If vs IIf ,兩者的差異