C#中截取某長度的中文字串

  • 63049
  • 0
  • 2008-11-12

在C#中截取字串的方法用string.Substring(),但若遇到中英文都有的字串,
那Run出來的結果就不是我們要的了...如以下範例...
string l_Tmp0 = "abc這是測試";
l_Tmp0.Substring(0,3) ==> abc
l_Tmp0.Substring(0,4) ==> abc這
l_Tmp0.Substring(0,5) ==> abc這是
解決這個問題可以使用System.Text.Encoding.Default.GetString()..
我寫了一個function在此share給各位

在C#中截取字串的方法用string.Substring(),但若遇到中英文都有的字串,
那Run出來的結果就不是我們要的了...如以下範例...
 

    string l_Tmp0 = "abc這是測試";
    l_Tmp0.Substring(0,3) ==> abc
    l_Tmp0.Substring(0,4) ==> abc這
    l_Tmp0.Substring(0,5) ==> abc這是

解決這個問題可以使用System.Text.Encoding.Default.GetString()..
我寫了一個function在此share給各位
 

01 string SubStr(string a_SrcStr, int a_Cnt)
02         {
03             return SubStr(a_SrcStr, 0, a_Cnt);
04         }

05
06         /// <summary>
07         /// 將某字串截取某bytes的字串,解決中文字串問題
08         /// </summary>
09         /// <param name="a_SrcStr"></param>
10         /// <param name="a_StartIndex"></param>
11         /// <param name="a_Cnt"></param>
12         /// <returns></returns>
13         string SubStr(string a_SrcStr, int a_StartIndex, int a_Cnt)
14         {
15             byte[] l_byte = System.Text.Encoding.Default.GetBytes(a_SrcStr);
16             if (a_Cnt <= 0)
17                 return "";
18             //例若長度10
19             //若a_StartIndex傳入9 -> ok, 10 ->不行
20             if (a_StartIndex+1 > l_byte.Length)
21                 return "";
22             else
23             {
24                 //若a_StartIndex傳入9 , a_Cnt 傳入2 -> 不行 -> 改成 9,1
25                 if (a_StartIndex + a_Cnt > l_byte.Length)
26                     a_Cnt = l_byte.Length - a_StartIndex;
27             }

28             return System.Text.Encoding.Default.GetString(l_byte, a_StartIndex, a_Cnt);
29         }

測試結果...
string l_Tmp = "abc這是測試";
SubStr(l_Tmp, 3) ==> abc
SubStr(l_Tmp, 4) ==> abc?
SubStr(l_Tmp, 5) ==> abc這
SubStr(l_Tmp, 6) ==> abc這?
SubStr(l_Tmp, 7) ==> abc這是
SubStr(l_Tmp, 20) ==> abc這是測試
SubStr(l_Tmp, 3,2) ==> 這
SubStr(l_Tmp, 20,2) ==>
至於如何去截一半中文產生的?問號,期待高手指教一下..

 update 97/11/12感謝ryantsai兄的回應,下方SubStr已根據ryantsai兄的方法改為新版

 

        public string SubStr(string a_SrcStr, int a_StartIndex, int a_Cnt)
        {
            Encoding l_Encoding = Encoding.GetEncoding("big5", new EncoderExceptionFallback(), new DecoderReplacementFallback(""));
            byte[] l_byte = l_Encoding.GetBytes(a_SrcStr);
            if (a_Cnt <= 0)
                return "";
            //例若長度10
            //若a_StartIndex傳入9 -> ok, 10 ->不行
            if (a_StartIndex + 1 > l_byte.Length)
                return "";
            else
            {
                //若a_StartIndex傳入9 , a_Cnt 傳入2 -> 不行 -> 改成 9,1
                if (a_StartIndex + a_Cnt > l_byte.Length)
                    a_Cnt = l_byte.Length - a_StartIndex;
            }

            return l_Encoding.GetString(l_byte, a_StartIndex, a_Cnt);
        }