我将此方法移植到VB.NET上了,请看源码(二)

作者:网络 来源:佚名 更新时间:2008-11-13 10:18:56 点击:
#region "由拼音到拼音"
    public shared function getpytopy(byval pystr as string, _
                                     optional byval iscomp as boolean = false) as string
        if pystr.length = 0 then exit function

        miscompelled = iscomp

        dim tonesite as integer
        dim tonevalue as integer
        dim tonechar as char

        tonesite = gettonesite(pystr)
        if tonesite = -1 then
            return pystr
        elseif tonesite < -1 then
            exit function
        end if

        tonevalue = gettonevalue(pystr, tonesite)
        if tonevalue = -1 then exit function

        if miscompelled then
            tonechar = gettonechar(pystr, tonesite - 1)
        else
            tonechar = gettonechar(pystr)
        end if
        if not ispychar(tonechar) then exit function
        return conversion(pystr, tonesite, tonevalue, tonechar)

    end function
    '返回标明声调数值的位置
    private shared function gettonesite(byval pystr as string) as integer
        if pystr.length = 0 then exit function
        dim i as integer, j as integer = 0
        '检查字串中有几个数字
        for i = 0 to pystr.length - 1
            if char.isnumber(pystr.chars(i)) then
                j += 1
            end if
        next
        if j = 0 then       '没有数字,即没有标明声调的数值
            return -1
        elseif j = 1 then   '有一个数字,合法
            for i = 0 to pystr.length - 1
                if char.isnumber(pystr.chars(i)) then
                    return i
                end if
            next
        else                '有多个数字,不合法,返回其相反数
            return -j
        end if
    end function
    '返回声调是几声
    private shared function gettonevalue(byval pystr as string, _
                                         byval site as integer) as integer
        if pystr.length = 0 then exit function
        if site >= 0 then
            dim value as char = pystr.chars(site)
            dim num as integer
            if char.isnumber(value) then
                num = ctype(value.tostring, integer)
                if num >= 0 and num <= 4 then
                    return num
                else
                    return -1
                end if
            else
                return -1
            end if
        end if
    end function
    '返回要标声调的字母
    private shared function gettonechar(byval pystr as string, _
                                     byval site as integer) as char
        if pystr.length = 0 then exit function
        if site >= 0 then
            dim value as char = pystr.chars(site)
            return value
        end if
    end function
    private shared function gettonechar(byval pystr as string) as char
        if pystr.length = 0 then exit function
        dim chr as char

        if pystr.indexof(a(0)) >= 0 then
            chr = pystr.chars(pystr.indexof(a(0)))
        elseif pystr.indexof(o(0)) >= 0 then
            chr = pystr.chars(pystr.indexof(o(0)))
        elseif pystr.indexof(e(0)) >= 0 then
            chr = pystr.chars(pystr.indexof(e(0)))
        elseif pystr.indexof(i(0)) >= 0 then
            chr = pystr.chars(pystr.indexof(i(0)))
        elseif pystr.indexof(u(0)) >= 0 then
            chr = pystr.chars(pystr.indexof(u(0)))
        elseif pystr.indexof(v(0)) >= 0 then
            chr = pystr.chars(pystr.indexof(v(0)))
        end if

        return chr
    end function
    '判断是否为合法的拼音字符
    private shared function ispychar(byval chr as char) as boolean
        select case chr
            case "a"c
                return true
            case "o"c
                return true
            case "e"c
                return true
            case "i"c
                return true
            case "u"c
                return true
            case "v"c
                return true
            case else
                return false
        end select
    end function
    '转换
    private shared function conversion(byval pystr as string, _
                                       byval tonesite as integer, _
                                       byval tonevalue as integer, _
                                       byval tonechar as char) as string
        if tonevalue >= 1 and tonevalue <= 4 then
            select case tonechar
                case "a"
                    pystr = pystr.replace(tonechar, a(tonevalue).chars(0))
                case "o"
                    pystr = pystr.replace(tonechar, o(tonevalue).chars(0))
                case "e"
                    pystr = pystr.replace(tonechar, e(tonevalue).chars(0))
                case "i"
                    pystr = pystr.replace(tonechar, i(tonevalue).chars(0))
                case "u"
                    pystr = pystr.replace(tonechar, u(tonevalue).chars(0))
                case "v"
                    pystr = pystr.replace(tonechar, v(tonevalue).chars(0))
            end select
            pystr = pystr.replace(tonevalue.tostring, "")
            return pystr
        end if
    end function
#end region

#region "由汉字到拼音"
    public shared function gethztopy(byval hzstr as string, _
                                 optional byval tonevalue as integer = 0, _
                                 optional byval iscomp as boolean = false) as string
        'byval tonevalue as integer, _
        if hzstr.length = 0 then exit function
        if pylist.count = 0 then loadpychars()
        miscompelled = iscomp
        if miscompelled then
        else
            dim tmpstr as string = ""
            dim i as integer
            dim num as integer
            for i = 1 to hzstr.length
                num = asc(hzstr)
                debug.writeline(num.tostring)
                tmpstr = getpychars(num)
                tmpstr = getpytopy(tmpstr & tonevalue)
                return tmpstr
            next
        end if
    end function

    private shared function getpychars(byval num as integer) as string
        if num > 0 and num < 160 then
            return chr(num)
        else
            if num < -20319 or num > -10247 then
                return ""
            else
                dim i, value as integer
                for i = pylist.count - 1 to 0 step -1
                    if pylist.getbyindex(i) <= num then exit for
                next
                'value = ctype(pylist.getbyindex(i), integer)
                return pylist.getkey(i).tostring
            end if
        end if
    end function
#end region

end class