在新聞文章項目里經(jīng)常會(huì )碰到在前臺顯示標題列表,因為前臺界面都是固定好了的,所以在顯示時(shí)必須限制標題顯示字符數量,超過(guò)這個(gè)數字的字符將被截去,以“...”之類(lèi)的代替。
截取字符串我們一般最常用也最簡(jiǎn)單的就是用string的
Substring方法,這種方法在取值時(shí)漢字字母是不區分的,而因為漢字跟字母在顯示時(shí)寬度有很大區別,所以截取后相同長(cháng)度字符時(shí)有字母數字跟不帶字母數字的字符串顯示上回有很大區別,從而影響整個(gè)排版,比如下面的字符串:
繁時(shí)不可慌,閑時(shí)不可荒
fsbkh,xsbkh
同為相同字符數,顯示時(shí)就極不對稱(chēng)了。
另外一種方法就是,把字符串轉化為bytes,在計算字符串的byte數時(shí)一個(gè)漢字按兩個(gè)byte處理的,所以在截取字符時(shí)就避免了漢字字母顯示時(shí)的不對稱(chēng),以下自己寫(xiě)的一個(gè)標題字符串截取函數: 截取字符串長(cháng)度
1 /**/''' <summary>
2 ''' 截取字符串長(cháng)度
3 ''' </summary>
4 ''' <param name="str">待處理的字符串</param>
5 ''' <param name="len">截取長(cháng)度</param>
6 ''' <param name="strMore">超過(guò)長(cháng)度部分顯示字符</param>
7 ''' <returns>String</returns>
8 ''' <remarks>超過(guò)固定長(cháng)度顯示固定字符串替代</remarks>
9 Public Function CutString()Function CutString(ByVal str As String, ByVal len As Integer, ByVal strMore As String) As String
10 Dim sarr As Byte() = System.Text.Encoding.Default.GetBytes(str)
11 Dim strMoreLength As Integer = System.Text.Encoding.Default.GetBytes(strMore).Length
12 If sarr.Length > len Then
13 Return System.Text.Encoding.Default.GetString(sarr, 0, len - strMoreLength) & strMore
14 Else
15 Return str
16 End If
17 End Function 上面這個(gè)方法也很簡(jiǎn)單,但是還有個(gè)問(wèn)題,就是如果我要處理的字符串是“520字符串截取”,按上面的方法,它的GetBytes.Length應該等于13,如果我要截取的長(cháng)度len=10的話(huà),那么它截取后的字符串就成了“520字符串?”因為sarr(9)即第十個(gè)byte的值其實(shí)是表示"截"字的兩個(gè)byte中的一個(gè),這樣就會(huì )出現文字顯示錯誤。
看到另外一種方法,先用asc()得到字符的ascii碼,如果asc()<0就是漢字,這時(shí)長(cháng)度就算2,否子算一個(gè)字符長(cháng)度,這種方法就避免了上面的截取字符串造成字符丟失的情況:
Code
1Public Shared Function LeftByte()Function LeftByte(ByVal Str As String, ByVal Lens As Double) As String
2 Dim Length
3 Length = 0
4 Dim i As Integer
5 For i = 1 To Len(Str)
6 If (Asc(Mid(Str, i, 1)) < 0) Then
7 Length = Length + 2
8 Else
9 Length = Length + 1
10 End If
11 If Length = Lens Then
12 LeftByte = Left(Str, i)
13 Exit Function
14 ElseIf Length > Lens Then
15 LeftByte = Left(Str, i - 1)
16 Exit Function
17 End If
18 Next
19 Return Str
20 End Function 綜合以上一些方法,自己寫(xiě)了個(gè)針對處理字符串的函數:超過(guò)規定長(cháng)度時(shí)即截取,省略的字符做參數添加,比如想在省略的字符處顯示"……"或"..."或"--"都可以,免去了每個(gè)顯示都要去重寫(xiě)一次方法的煩瑣:
Code
1 /**/''' <summary>
2 ''' 截取字符串長(cháng)度
3 ''' </summary>
4 '''<Author>TheoMi</author>
5 '''<date>2008-03-15</date>
6 ''' <param name="Str">待處理的字符串</param>
7 ''' <param name="Lens">截取長(cháng)度</param>
8 ''' <param name="StrMore">超過(guò)長(cháng)度部分顯示字符</param>
9 ''' <returns>String</returns>
10 ''' <remarks> 區分漢字數字字母的長(cháng)短問(wèn)題,超過(guò)固定長(cháng)度顯示固定字符串替代</remarks>
11 Public Shared Function CutStringByByte()Function CutStringByByte(ByVal Str As String, ByVal Lens As Integer, ByVal StrMore As String) As String
12 Dim Length As Integer = 0
13 Dim strBytesLength As Integer = System.Text.Encoding.Default.GetBytes(Str).Length
14 Dim MoreLength As Integer = System.Text.Encoding.Default.GetBytes(StrMore).Length
15 Dim i As Integer
16 If strBytesLength > Lens Then
17 For i = 1 To Len(Str)
18 If (Asc(Mid(Str, i, 1)) < 0) Then
19 Length = Length + 2
20 Else
21 Length = Length + 1
22 End If
23 If Length = Lens - MoreLength Then
24 CutStringByByte = Left(Str, i) & StrMore
25 Exit Function
26 ElseIf Length > Lens - MoreLength Then
27 CutStringByByte = Left(Str, i - 1) & StrMore
28 Exit Function
29 End If
30 Next
31 Else
32 For i = 1 To Len(Str)
33 If (Asc(Mid(Str, i, 1)) < 0) Then
34 Length = Length + 2
35 Else
36 Length = Length + 1
37 End If
38 If Length = Lens Then
39 CutStringByByte = Left(Str, i)
40 Exit Function
41 ElseIf Length > Lens Then
42 CutStringByByte = Left(Str, i - 1)
43 Exit Function
44 End If
45 Next
46 End If
47 Return Str
48 End Function