在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出來的結果就不是我們要的了...如以下範例...
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給各位
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兄的方法改為新版
{
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);
}