2014年4月20日 星期日

[C#] 檔案交換之Big5編碼中文長度問題

交換之檔案格式是限定Big5,英文長度 1 byte 中文則是2 byte

但在 NET不管中英文數字都是 1 Char,使用 length property 是計算有幾個Char而不管是多少byte.

所以如果在Big5檔案格式中,某個欄位長度限制為100 那就必須先將文字內容轉為Bytes來做處理。

Example

static void Main(string[] args)
{  
   String testStr = "JBBlog" String input = testStr.PadRight(100,' ');
   Console.WriteLine(String.Format("原始字串Big5長度:{0}",
         Encoding.GetEncoding("big5").GetBytes(input).Length));    
  
   String convertInput = covertToBig5(input,100);  
Console.WriteLine(String.Format("轉換後字串Big5長度:{0}",
         Encoding.GetEncoding("big5").GetBytes(convertInput).Length));
}

private static String covertToBig5(String str, int len)
{  
byte[] strBytes = Encoding.GetEncoding("big5").GetBytes(str);
   String big5Str = Encoding.GetEncoding("big5").GetString(strBytes,0, len);
   return big5Str;
}

Result
原始字串Big5長度:101
轉換後字串Big5長度:100

可以看到如果不轉成Bytes來做處理,得到的第一個實際長度是101 bytes (因為包含一個中文)
轉換成Bytes再處理後的長度才是正確的100 bytes.


沒有留言:

張貼留言