ITPub博客

首页 > 数据库 > Oracle > VB.NET按照字节数来截取字符串(以UTF8编码方式为例)

VB.NET按照字节数来截取字符串(以UTF8编码方式为例)

Oracle 作者:roy_bolt 时间:2013-11-05 16:17:13 0 删除 编辑
    在VB.net中,系统提供了Substring这个功能,但是它是按照字符串的个数来截取字符串的(具体用法我前面有文章提到,此处跳过)。
    因为Oracle中创建table时,指定的字段的长度是按照字节数来计算的,所以在VB.NET中,想要控制insert的字段值的长度不超长,就需要一个对字符串进行截取。
    例如:我们某个字段A的属性为VARCHAR2(100), 故最多只能存储100字节长度的字符串。当我们存入一个字符串,含有100个字符,但是(按照UTF8编码方式)其中有一个汉字(占3字节)或者西文字符(如ó,占2字节)时,这个字符串的字节长度就超过100,insert就不成功。
    为此,我们通常的做法是先将该字符串进行一个截取,再insert,不过Substring在这里就达不到理想的效果了。本人在此提供一个按字符截取的function,仅供参考。
    最简单的做法当然是对字符串做遍历,然后按字符一个一个的数,然后取得所需的长度。但是当一个字符串非常大的时候,这样数就会有performance的问题,所以,建议用二分法来做,即一半一半的取。
    Function如下:
    '''
    ''' 按字节截取字符串
    '''
    '''接收需要截取的字符串
    '''需要截取的长度
    '''
    '''
    Public Function strCutOut(ByVal p_str As String, ByVal p_len As Integer) As String
        Dim strNew As String = String.Empty
        Try
            Dim intLenbyByte As Integer = System.Text.Encoding.UTF8.GetByteCount(p_str) '按照UTF8编码方式取得p_str的字节数
            If intLenbyByte <= p_len Then
                strNew = p_str
                Return strNew 
            End If

            Dim intWholeLenByCha As Integer = p_str.Length '按字符个数计算总长度
            Dim intWholeLenByByte As Integer = 0           '按字符字节数计算总长度
            Dim intHalfLenByCha As Integer = 0             '因为用的是二分法,所以存储每次所需取得的字符个数的一半
            Dim intLastIndexByCha As Integer = 0           '上一次计算时的字符的个数

            For i = 0 To p_str.Length - 1
                If i = 0 Then
                    strNew = p_str.Substring(0, intWholeLenByCha / 2)
                    intHalfLenByCha = intWholeLenByCha / 2
                Else
                    strNew = p_str.Substring(0, i)
                End If

                intWholeLenByByte = System.Text.Encoding.UTF8.GetByteCount(strNew)

                If intWholeLenByByte = p_len Then
                    Return strNew
                ElseIf intWholeLenByByte < p_len Then
                    intLastIndexByCha = i
                    intHalfLenByCha = (intWholeLenByCha - (i + 1)) / 2 '总字符长度需要减的字符个数应该是index i +1
                    i = i + intHalfLenByCha
                Else
                    If intLastIndexByCha = i - 1 Then '满足if条件时表明特殊字符占多个字节,且刚好卡在临界位
                        strNew = p_str.Substring(0, intLastIndexByCha)
                        Return strNew
                    End If
                    i = intLastIndexByCha + intHalfLenByCha / 2
                    intHalfLenByCha = intHalfLenByCha / 2
                End If
            Next

            Return strNew
        Catch ex As Exception
            Return ex.ToString
        End Try
    End Function

    :不难理解,按上面的举例来说,当一个西文字符刚好卡在第100,101位的时候,所返回的就是一个字节长度为99的字符串,或者当一个汉字卡在第99,100,101位的时候,返回的就是一个字节长度为98的字符串。
    此function对于含有占多位字节的字符的字符串的截取比较有用,所以,不含特殊字符的字符串的截取,用Substring就ok。
    Bingo,有什么问题,欢迎大家批评指正. VB.NET按照字节数来截取字符串(以UTF8编码方式为例)
<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22191610/viewspace-1116382/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-07-25