demoshop

NEWS

demo, trying to be the best.

站內搜尋載入中...

正確的計算出中英文字數

  • 14367
  • 0

之前demo用過一個簡訊系統,他在計算中英文的時候經常出錯,當初的demo還是個不會寫程式的小玩意,所以也無力修改,今天剛好看到網路有人PO了相關資料,於是就紀錄下來吧,以後應該會用到。

    因為簡訊系統這玩意,如果說一封簡訊可以有70個字,輸入一個洋文減一但是輸入中文就會減二,要怎麼明確的判別是不是中文呢?可以利用Unicode的範圍來了解

    前128個Unicode字元(16位元從0x0000到0x007F)就是ASCII字元,接下來的128個Unicode字元(代碼從0x0080到0x00FF)是ISO 8859-1對ASCII的擴展。

    • 中國、日本和韓國的象形文字(總稱為CJK)佔用了從0x3000到0x9FFF的代碼
    • 希臘字母表使用從0x0370到0x03FF的代碼
    • 斯拉夫語使用從0x0400到0x04FF的代碼
    • 美國使用從0x0530到0x058F的代碼
    • 希伯來語使用從0x0590到0x05FF的代碼

     


    知道了這些資訊就不難玩啦,先建立好測試頁面

    <asp:TextBox ID="TextBox1" runat="server" onkeyup="Calculation(this)"></asp:TextBox>
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" OnClientClick="Calculation(TextBox1)" Text="Button" />
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    <span id="show"></span> 

    JS的寫法

    <script type="text/javascript">
        function Calculation(str) {
            String.prototype.Blength = function() {
                var arr = this.match(/[^\x00-\xff]/ig);
                return arr == null ? this.length : this.length + arr.length;
            }
            var span = document.getElementById("show");
            span.innerHTML = "<br/>字元數:" + str.value.length + "<br>" + "byte數:" + str.value.Blength()
            //字元數就是有幾個字,byte數就是洋文算1中文算2的總和
        }
    </script> 
    

    ASP.NET的寫法

    protected void Button1_Click(object sender, EventArgs e)
    {
        int english=0, chinese = 0,max = 70,i;
        string textStr=this.TextBox1.Text;
        for (i = 0; i < textStr.Length; i++)
        {
            if (textStr[i] >= 0x3000 && textStr[i] <= 0x9FFF)
                chinese++;
            else
                english++;
        }
        this.Label1.Text=string.Format("<br>最大數:{3}<br>洋文:{0}<br>中文:{1}<br>尚有:{2}可輸入",english,chinese,max-(english+chinese*2),max);  
    } 

    在demo初步測試這玩意還滿準的,如果有啥bug還請通知我勒

     


    http://www.dotblogs.com.tw/puma/archive/2008/10/19/5724.aspx
    http://www.blueshop.com.tw/board/show.asp?subcde=BRD20080805173342PL2&fumcde=FUM20041006152641OLG