前两天写了个.NET截取中英文混合字符串的小程序,详见http://blog.csdn.net/CityBird/archive/2011/04/11/6316846.aspx,Print出来的结果也都正常,本以为没什么问题了,但是实际在使用过程中却出了大麻烦,主要是截取的位置正好在中文字符的中间部位时,由于截取结果的最后一个字节是半个汉字,虽然Print出来的时候看不到,但是如果写到文件里面,就会发现后面多出点乱码,拿System.Text.Encoding.Default.GetBytes再次把截取以后的字符串转成Byte数组,结果发现截取内容以外的部分依然存在着,只是将截取的部位的下一个字符用字符串终止符替换了一下而已。由此可见System.Text.Encoding.Default.GetString的实现方法实际就是一个字符替换操作,原字符串申请的存储空间什么的全都没有释放。其实存储空间释放不释放的跟我其实没啥关系,反正取值的时候只是返回终止符前面的内容,只要别再用System.Text.Encoding.Default.GetBytes去取截取后的字符串字节长度就行了,现在的关键问题是后面多出的那点尾巴怎么处理呢,唉,头疼,想了很多办法都不行,没办法最后还是老老实实的用最土的办法来做吧,拿System.Text.Encoding.Default.GetBytes把原始字符串转成数组,然后判断最后一个字节是不是半个汉字,如果是半个汉字用System.Text.Encoding.Default.GetString截取的时候就少截取一个字节的内容好了。具体代码如下:
Public Function SubString(ByVal Source As String, ByVal Length As Integer) As String '字符串转成ASCII字节数组 Dim tmpByteArr() As Byte tmpByteArr = System.Text.Encoding.Default.GetBytes(Source) If Length >= tmpByteArr.Length Then Return Source Else Dim tmpa As Integer = 0 For i As Integer = 0 To Length - 1 If tmpByteArr(i) > 127 Then '计算要截取内容里面大于127的字节数 tmpa = tmpa + 1 End If Next If tmpa Mod 2 = 1 Then '奇数个大于127的字节表明存在半个汉字,偶数个就不存在 Return System.Text.Encoding.Default.GetString(tmpByteArr, 0, Length - 1) & "…" Else Return System.Text.Encoding.Default.GetString(tmpByteArr, 0, Length) & "…" End If End If End Function
--------------------------------------------------------------------------------------------------PS:本文档为本人原创,如需转载请注明作者及出处。谢谢!