| 网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 |
![]() |
| Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道 |
在新闻文章项目里经常会碰到在前台显示标题列表,因为前台界面都是固定好了的,所以在显示时必须限制标题显示字符数量,超过这个数字的字符将被截去,以“……”之类的代替。
网管网www_bitscn_com
截取字符串我们一般最常用也最简单的就是用string的Substring方法,这种方法在取值时汉字字母是不区分的,而因为汉字跟字母在显示时宽度有很大区别,所以截取后相同长度字符时有字母数字跟不带字母数字的字符串显示上回有很大区别,从而影响整个排版,比如下面的字符串:繁时不可慌,闲时不可荒fsbkh,xsbkh同为相同字符数,显示时就极不对称了。 中国网管论坛bbs.bitsCN.com
另外一种方法就是,把字符串转化为bytes,在计算字符串的byte数时一个汉字按两个byte处理的,所以在截取字符时就避免了汉字字母显示时的不对称,以下自己写的一个标题字符串截取函数: 网管bitscn_com
| 1 ![]() /**/''' <summary> 网管网www_bitscn_com 2 ''' 截取字符串长度3 ''' </summary>4 ''' <param name="str">待处理的字符串</param> 网管论坛bbs_bitsCN_com 5 ''' <param name="len">截取长度</param>6 ''' <param name="strMore">超过长度部分显示字符</param> 中国网管联盟bitsCN.com 7 ''' <returns>String</returns>8 ''' <remarks>超过固定长度显示固定字符串替代</remarks> 网管bitscn_com 9 ![]() Public Function CutString()Function CutString(ByVal str As String, ByVal len As Integer, ByVal strMore As String) As String 网管bitscn_com 10 Dim sarr As Byte() = System.Text.Encoding.Default.GetBytes(str)11 Dim strMoreLength As Integer = System.Text.Encoding.Default.GetBytes(strMore).Length 网管网www.bitscn.com 12 If sarr.Length > len Then13 Return System.Text.Encoding.Default.GetString(sarr, 0, len - strMoreLength) & strMore 网管u家u.bitsCN.com 14 Else15 Return str16 End If 网管网www_bitscn_com 17 End Function |
网管联盟bitsCN@com
上面这个方法也很简单,但是还有个问题,就是如果我要处理的字符串是“520字符串截取”,按上面的方法,它的GetBytes.Length应该等于13,如果我要截取的长度len=10的话,那么它截取后的字符串就成了“520字符串?”因为sarr(9)即第十个byte的值其实是表示"截"字的两个byte中的一个,这样就会出现文字显示错误。
看到另外一种方法,先用asc()得到字符的ascii码,如果asc()<0就是汉字,这时长度就算2,否子算一个字符长度,这种方法就避免了上面的截取字符串造成字符丢失的情况:
1![]() Public Shared Function LeftByte()Function LeftByte(ByVal Str As String, ByVal Lens As Double) As String 网管bitscn_com 2 Dim Length3 Length = 04 Dim i As Integer 网管联盟bitsCN_com 5 For i = 1 To Len(Str)6 If (Asc(Mid(Str, i, 1)) < 0) Then 网管bitscn_com 7 Length = Length + 28 Else9 Length = Length + 1 网管论坛bbs_bitsCN_com 10 End If11 If Length = Lens Then 网管联盟bitsCN_com 12 LeftByte = Left(Str, i)13 Exit Function 网管下载dl.bitscn.com 14 ElseIf Length > Lens Then15 LeftByte = Left(Str, i - 1) 中国网管联盟bitsCN.com 16 Exit Function17 End If18 Next 网管u家u.bitsCN.com 19 Return Str20 End Function |
综合以上一些方法,自己写了个针对处理字符串的函数:超过规定长度时即截取,省略的字符做参数添加,比如想在省略的字符处显示"……"或"……"或"——"都可以,免去了每个显示都要去重写一次方法的烦琐:
1![]() /**/''' <summary> 网管u家u.bitscn@com 2 ''' 截取字符串长度3 ''' </summary>4 '''<Author>TheoMi</author> 网管联盟bitsCN_com 5 '''<date>2008-03-15</date>6 ''' <param name="Str">待处理的字符串</param> 网管论坛bbs_bitsCN_com 7 ''' <param name="Lens">截取长度</param>8 ''' <param name="StrMore">超过长度部分显示字符</param> 网管bitscn_com 9 ''' <returns>String</returns>10 ''' <remarks> 区分汉字数字字母的长短问题,超过固定长度显示固定字符串替代</remarks> 中国网管联盟bitsCN.com 11 ![]() Public Shared Function CutStringByByte()Function CutStringByByte(ByVal Str As String, ByVal Lens As Integer, ByVal StrMore As String) As String 网管bitscn_com 12 Dim Length As Integer = 013 Dim strBytesLength As Integer = System.Text.Encoding.Default.GetBytes(Str).Length 网管网www.bitscn.com 14 Dim MoreLength As Integer = System.Text.Encoding.Default.GetBytes(StrMore).Length15 Dim i As Integer 中国网管联盟bitsCN.com 16 If strBytesLength > Lens Then17 For i = 1 To Len(Str) 网管网www_bitscn_com 18 If (Asc(Mid(Str, i, 1)) < 0) Then 网管联盟bitsCN_com 19 Length = Length + 220 Else 网管下载dl.bitscn.com 21 Length = Length + 122 End If 网管论坛bbs_bitsCN_com 23 If Length = Lens - MoreLength Then24 CutStringByByte = Left(Str, i) & StrMore 中国网管论坛bbs.bitsCN.com 25 Exit Function26 ElseIf Length > Lens - MoreLength Then 网管网www.bitscn.com 27 CutStringByByte = Left(Str, i - 1) & StrMore28 Exit Function 网管下载dl.bitscn.com 29 End If30 Next31 Else 网管u家u.bitscn@com 32 For i = 1 To Len(Str)33 If (Asc(Mid(Str, i, 1)) < 0) Then 中国网管论坛bbs.bitsCN.com 34 Length = Length + 235 Else 网管u家u.bitscn@com 36 Length = Length + 137 End If 网管下载dl.bitscn.com 38 If Length = Lens Then39 CutStringByByte = Left(Str, i) 网管联盟bitsCN_com 40 Exit Function41 ElseIf Length > Lens Then 网管u家u.bitscn@com 42 CutStringByByte = Left(Str, i - 1)43 Exit Function 网管网www_bitscn_com 44 End If45 Next46 End If 网管网www.bitscn.com 47 Return Str48 End Function |
|
0
|
评论加载中…