去年的時候由於工作需要,寫了個用C#截取指定長度的方法,當時頗費了一番周折,因為想錯了方向。
例如要截取字串"我是1個中國人",取3位長度,那得到的結果是"我",如果取6位長度,得到的結果是"我是1",因為漢字是兩個位元組。
當時的思路主要是考慮最後一位是單位元組還是雙位元組,不過最終得出了比較不錯的方法,只是這方法後來卻找不到了,重新寫一個又太懶,想或許到Google上能搜尋到,但是可惜的是,搜尋到的方法幾乎都有問題,不單是效率,還有結果都不能正常顯示,有的文章甚至被不少大網站互相轉來轉去,呀,沒有人調試過嗎?
拿出時間來自己寫一個,大家看代碼:
public static string GetSubString(string str, int length)
{
string temp = str;
int j = 0;
int k = 0;
for (int i = 0; i < temp.Length; i++)
{
if (Regex.IsMatch(temp.Substring(i, 1), @"[\u4e00-\u9fa5]+"))
{
j += 2;
}
else
{
j += 1;
}
if (j <= length)
{
k += 1;
}
if (j >= length)
{
return temp.Substring(0, k);
}
}
return temp;
}
具體思路是,定義兩個變數:j 與K,例如要截取字串"我是1個中國人",取3位長度,從第一個字元開始判斷——temp.Substring(i, 1),如果是雙位元組j+2,否則加1,而變數K則每次迴圈加1,用來執行最後的截取操作。
當j <= 要截取的位元組數,變數K停止加1。
當j >= 要截取的位元組數,根據K返回截取後的結果。
看到別人的方法,都是最先將整個字串中的中文替換成雙位元組,然後判斷總長度是否大於需要截取的長度,如果大於再執行截取,而這樣無疑是低效的(如果需要截取的字串有1萬個字元,需要返回的是20個字元,同時返回20條記錄的話需要替換幾十萬次....),還要接下來再判斷是該截取幾位.....
轉自:http://www.cnblogs.com/asp600/archive/2006/10/16/530865.aspx