none
請問有那種 Encoding 是所有字元都是固定 byte 的? RRS feed

  • 問題

  • db 內固定欄位, 但中文字和英文字用的 byte 不同, 而 string.length 是計字數 (中/英文也是 1 個) , 所以要寫一個 function 逐個字計有否超出長度 (fixed length),

    英文: 1byte

    中文: 3byte (這個我有點奇怪, 不是 2 byte 嗎)

    運作上來, 每個欄位也要執行該 function, 比較麻熕, 有沒有一種 encoding 是英文, 中文也是用同一容量?

     private int getTotalByte(string s, int maxLen)
        {
            Encoding enc = Encoding.GetEncoding("utf-8");       
            int j = 0; // 實際字串所用的 byte 量

            
            for (int k = 0; k < s.Length; k++)
            {
                j += enc.GetByteCount(s.Substring(k, 1));
                if (j > maxLen)
                    break;        }
            return j;
        }

     


    • 已編輯 asp.coder 2011年10月30日 下午 04:25
    2011年10月30日 下午 04:22

解答

  • Unicode 內,大部分的字都是 2 bytes ,Unicode 5.0 的字 4 bytes 。

    中文字 是 6 bytes ,abc 也是 6 bytes 。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 asp.coder 2011年11月1日 下午 05:37
    2011年10月31日 下午 02:52
  • 今日偶然再看看悅知文化的 Jeffry Richter 的書, 提醒了我! Windows 控制用的是 unicode (utf-16), 而 unicode 統一是 2 bytes (中英文) 也是, 再把所有 file read/write 的 encoding 調至 unicode, 所有問題都一掃而空了! 連那個 function 都不需用, 非常好!
    • 已標示為解答 asp.coder 2011年11月1日 下午 05:37
    2011年11月1日 下午 05:37

所有回覆

  • 你可以先把 U 開頭的都試一遍.

    2011年10月30日 下午 10:28
  • UTF-8本來就是變動字元寬度的;UTF-16 則是固定字元寬度的。不過或許你可以思考一下為什麼普遍上大家都使用UTF-8。

     


    ASP.NET 2Share - http://www.dotblogs.com.tw/johnny
    2011年10月30日 下午 10:46
  • 因為 Unicode 5.0 已經擴展到 10 萬字,所以 UTF16 已經不夠用了... 可以看看這篇:

    [測試記錄] UTF32 位元組數與 Char 型別~

     


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年10月31日 下午 12:43
  • 請問大家在處理固定長度(byte) 欄位時, 如何處理中英夾雜的情況呢? 甚至是多國語言對固定長度欄位。

    我現在的方法是用 Substring 逐個字元 test 其 byte 數, 然後把字元連接, 若字元超出固定長度 (byte) 時, 就不連接

    但這方法要做很多功夫, 安排上比較麻煩, 如用 utf-16 , db 容量又倍數增加, 效率又會降低。


    • 已編輯 asp.coder 2011年10月31日 下午 12:51
    2011年10月31日 下午 12:51
  • 如果你那麼計較 byte 數的話,你為何不在前端限制使用者的輸入字數呢?例如限制欄位不能超過10個字,那麼就算全部輸入中文字,也不會超過 30 bytes。我個人不認為這會花上什麼工夫。此外,除非你的使用者超過幾百或幾千萬人,否則現在的資料庫效能與容量都很不錯 (何況文字資料所佔的容量相對而言是小的);或許你可以把精力放在像保留客戶資訊若干天,以及如何備份過期資料之類的事情吧。

     


    ASP.NET 2Share - http://www.dotblogs.com.tw/johnny
    • 已編輯 Johnny.Net 2011年10月31日 下午 01:07
    2011年10月31日 下午 01:06
  • VS 所提供的控件 (textbox, datagrid) 等, 都是以 unicode 為基礎, 中文字 (9 byte) 它當是 3 個字, abc (3 byte) 又是當 3 個字, 所以很難預計用戶輸入了多少個 byte (多少個字就很易控制)...

    現在我要在每個控件都要作計 byte 數的處理, 相當浪費時間

    2011年10月31日 下午 01:12
  • 我愈來愈不能理解了... 難道你的 TextBox 控制項裡沒有 MaxLength 這個屬性嗎?

     


    ASP.NET 2Share - http://www.dotblogs.com.tw/johnny
    2011年10月31日 下午 01:23
  • 你那麼堅持一定要計算 byte 數的話,那麼你把這一段程式拿去用好了:

     

    string input = TextBox1.Text;
    Encoding enc = Encoding.UTF8;
    char[] inp = input.ToCharArray();
    int i = enc.GetByteCount(inp);
    

     


    TextBox1 表示 TextBox 的 ID。最後得到的 i 就是 byte 數。

     


    ASP.NET 2Share - http://www.dotblogs.com.tw/johnny
    • 已編輯 Johnny.Net 2011年10月31日 下午 01:38
    2011年10月31日 下午 01:37
  • Unicode 內,大部分的字都是 2 bytes ,Unicode 5.0 的字 4 bytes 。

    中文字 是 6 bytes ,abc 也是 6 bytes 。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 asp.coder 2011年11月1日 下午 05:37
    2011年10月31日 下午 02:52
  • 今日偶然再看看悅知文化的 Jeffry Richter 的書, 提醒了我! Windows 控制用的是 unicode (utf-16), 而 unicode 統一是 2 bytes (中英文) 也是, 再把所有 file read/write 的 encoding 調至 unicode, 所有問題都一掃而空了! 連那個 function 都不需用, 非常好!
    • 已標示為解答 asp.coder 2011年11月1日 下午 05:37
    2011年11月1日 下午 05:37