GB与BIG5内码转换COM的原代码(已经贴在开发者俱乐部了,在这里再贴一下)

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 blood 的 blog

这个com用到了一个vc的资源文件。就是字典。
大家可以去61.134.75.70/download/gb2big5.zip下载

原代码如下:

'//////////////////////////////////////////
'中文名称:gb与big5内码互换控件
'英文名称:gb2big5
'作者:blood
'版本:1.0
'制作时间:2002.3.5
'版权所有 blood 2002 - 2003
'//////////////////////////////////////////

option explicit

'定义变量
dim big5data as variant
dim gbdata as variant

'定义自定义类型,用来处理编码的高低字问题
type chinesetypea
    lochar as byte
    hichar as byte
end type

private big5type(&ha1 to &hff, &h40 to &hfe) as chinesetypea    '对应于big5字库
private gbtype(&ha7 to &hff, &ha1 to &hfe) as chinesetypea      '对应与gb字库

'//////////////////
'公共函数开始
'//////////////////

'big5转换到gb的函数
        
function big5togb(strsource as string) as string
    dim i as long, y as long
    '定义数组,用来存放big5和gb内码数据
    dim btebig5() as byte
    dim btegb() as byte
    
    '如果输入的内容为空,则退出函数
    if strsource = "" then
        big5togb = ""
        exit function
    end if
    
    '将big5数组的类型从unicode编码转换为系统缺省码
    btebig5 = strconv(strsource, vbfromunicode)
    '确定big5数组的下标,用来循环将所有的big5内容转换为gb内码
    y = ubound(btebig5)
    redim btegb(0 to y)
    for i = 0 to y
        if i = y then
            btegb(i) = btebig5(i)
            exit for
        end if
        if btebig5(i) < &ha1 or btebig5(i + 1) < &h40 then
            btegb(i) = btebig5(i)
        else
            btegb(i) = big5type(btebig5(i), btebig5(i + 1)).lochar
            btegb(i + 1) = big5type(btebig5(i), btebig5(i + 1)).hichar
            i = i + 1
        end if
    next i
    '将系统缺省码转换为unicode编码
    big5togb = strconv(btegb, vbunicode)
    '重新初始化gb数组,以释放内存
    erase btegb
end function

'gb转换到big5的函数

function gbtobig5(strsource as string) as string
    dim i as long, y as long
    '定义数组,用来存放big5和gb内码数据
    dim btegb() as byte
    dim btebig5() as byte
    
    '如果输入的内容为空,则退出函数
    if strsource = "" then
        gbtobig5 = ""
        exit function
    end if
    
    '将gb数组的类型从unicode编码转换为系统缺省码
    btegb = strconv(strsource, vbfromunicode)
    '确定gb数组的下标,用来循环将所有的big5内容转换为gb内码
    y = ubound(btegb)
    redim btebig5(0 to y)
    
    for i = 0 to y
        if i = y then
            btebig5(i) = btegb(i)
            exit for
        end if
        if btegb(i) < &ha1 or btegb(i + 1) < &ha1 then
            btebig5(i) = btegb(i)
        else
            if btegb(i) < &hb0 and btegb(i + 1) >= &ha1 then
                btebig5(i) = gbtype(btegb(i) + 6, btegb(i + 1)).lochar
                btebig5(i + 1) = gbtype(btegb(i) + 6, btegb(i + 1)).hichar
            else
                btebig5(i) = gbtype(btegb(i), btegb(i + 1)).lochar
                btebig5(i + 1) = gbtype(btegb(i), btegb(i + 1)).hichar
            end if
            i = i + 1
        end if
    next i
    '将系统缺省码转换为unicode编码
    gbtobig5 = strconv(btebig5, vbunicode)
    '重新初始化big5数组,以释放内存
    erase btebig5
end function

'//////////////////
'公共函数结束
'//////////////////

'类初始化
private sub class_initialize()
    dim i as long
    dim j as long
    dim ilen as long
    
    '从资源文件中读取gb与big5的字库
    gbdata = loadresdata(102, "custom")      '//读取gb字库
    big5data = loadresdata(101, "custom")    '//读取big5字库
    
    for i = &ha1 to &hfe
        for j = &h40 to &hfe
            big5type(i, j).lochar = big5data(ilen)
            big5type(i, j).hichar = big5data(ilen + 1)
            ilen = ilen + 2
        next j
    next i
    
    ilen = 0
    
    for i = &ha7 to &hfe
        for j = &ha1 to &hfe
            gbtype(i, j).lochar = gbdata(ilen)
            gbtype(i, j).hichar = gbdata(ilen + 1)
            ilen = ilen + 2
        next j
    next i
end sub

本文关键:GB BIG5
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top