当前位置:编程学习 > VB >>

VB编码转换

我用VB6.0开发一个通信模块,服务器端接收的编码格式是UTF-8
代码中strSend为发送数据(格式为XML)
arrBuffer() = StrConv(strSend, vbFromUnicode)
lngByte = send(lngSocket, arrBuffer(0), lenEx(strSend), 0&)
Do While 1
            ReDim arrBuffer(1 To 1024)
            lngByte = recv(lngSocket, arrBuffer(1), 1024, 0&)
            If lngByte > 0 Then
                bDoloop = True
                
                strReadBuff = StrConv(arrBuffer, vbUnicode)
                Debug.Print strReadBuff
                strRec = strRec & Left$(strReadBuff, lngByte)
                Do While Asc(Right(strRec, 1)) = 0
                    strRec = Mid(strRec, 1, Len(strRec) - 1)
                    If Asc(Right(strRec, 1)) <> 0 Then Exit Do
                Loop
            End If
            lcntByte = lcntByte + lngByte
            
             
            If InStr(UCase$(Trim(className)), "CMEN") > 0 Then
            
            Dim weizhi2 As Integer
            
            weizhi2 = InStrRev(strRec, "</ap>")
            
            If lngByte <= 0 Or weizhi2 > 0 Then Exit Do
            
            End If
            
            
            If lngByte <= 0 Then Exit Do
        Loop

发送和接收时发送数据中有中文的情况下都是乱码,应该如何解决 --------------------编程问答-------------------- 用VB6.0开发一个通信模块,服务器端接收的编码格式是UTF-8ANSI 
代码中strSend为发送数据(格式为XML) 
arrBuffer() = StrConv(strSend, vbFromUnicode) 
lngByte = send(lngSocket, arrBuffer(0), UBOUND(arrBuffer)+1, 0&) 
strRec=""
Do  
            ReDim arrBuffer(0 To 1023) 
            lngByte = recv(lngSocket, arrBuffer(0), 1024, 0&) 
            If lngByte > 0 Then 
                strRec = strRec & arrBuffer
            else
                exit do
            End If 
Loop 
debug.print strconv(strRec,vbUnicode)

UTF-8格式VB6不支持,自己参考下面写一个吧
'UTF-8 编码字符理论上可以最多到 6个字节长,但目前全世界的所
'有文字和符号种类加起来也只要编到 4个字节长就够了。
'  UTF-8 是以 8位(即 1个字节)为单元对原始码进行编码(注意一
'点:这里所讲的原始码都是指Unicode码),并规定:多字节码(2个字
'节以上才称为多字节)以转换后第1个字节起头的连续“1”的数目(这
'些连续“1”称为标记位),表示转换成几个字节:“110”连续两个
'“1”,表示转换结果为2个字节,“1110”表示3个字节,而“11110”
'则表示4个字节……跟随在标记位之后的“0”,其作用是分隔标记位和
'字符码位。第2~第4个字节的起头两个位固定设置为“10”,也作为标
'记,剩下的6个位才做为字符码位使用。
'  这样,2字节UTF-8码剩下11个字符码位,可用以转换0080~07FF的
'原始字符码,3字节剩下16个字符码位,可用以转换0800~FFFF的原始字
'符码,由此类推。编码方式的模板如下:
'
'原始码(16进制) UTF-8编码(二进制)
'--------------------------------------------
'0000 - 007F       0xxxxxxx
'0080 - 07FF       110xxxxx 10xxxxxx
'0800 - FFFF       1110xxxx 10xxxxxx 10xxxxxx
'……
'--------------------------------------------
'
'  模板中的“x”表示字符码。
'  VB能识别的 Ascii码<007F,所以在VB中,Ascii码都只能编为1个
'字节的UTF-8码。汉字的 Unicode编码范围为0800-FFFF,所以被编为
'3个字节的UTF-8码。
'  例如“汉”字的Unicode编码是6C49,6C49在0800-FFFF之间,所以
'要用3个字节的模板:1110xxxx 10xxxxxx 10xxxxxx。
'  UTF-8文本文件与Unicode文本文件类似,在文件的头部也有标记字
'节,Unicode文件的标记是2个字节:&HFF 和 &HFE,UTF-8文件的标记
'是3个字节:&HEF、&HBB 和 &HBF
'
'  要写入UTF-8编码的文本文件,关键是对汉字编码的处理。我们从
'上述的汉字编码模板就可以看出,对汉字的处理步骤大致为:
'第一步:取得汉字的Unicode码
'第二步:将Unicode码分解为两个16进制数据
'第三步:将这两个16进制数据转换成二进制数据并连接
'第四步:将二进制数据分解为三个串,第一个串为4个位,在前面加上
'标记位“1110”,第二、三个串均为6个位,分别在前面加上“10”标
'记位
'第五步:将这三个串分别转换为10进制数据并赋值给字节型数组
'第六步:将字节型数组用二进制法写盘,并且要先在文本头存入三个字
'节的标记(&HEF、&HBB、&HBF),再将转换好的数据写入
'
'  要读取UTF-8编码的文本文件,对汉字的处理步骤大致为:
'第一步:用二进制法读入文本数据,赋值给字节型数组,并判断前3个字
'节是否UTF-8标记,如果是,才进行以下的处理
'第二步:逐个字节判断是否汉字编码,如果是,就再提取后两个数组元
'素,共三个数组元素来加以处理
'第三步:将这三个数据都转换成16进制数据
'第四步:将三个16进制数据都转换成二进制数据
'第五步:从第一个二进制数据中去掉前4位,从第二、三个二进制数据
'中分别去掉前2位,并将这三个处理后的二进制数据依次连接,成为一
'个16位的字串
'第六步:从这个二进制串中分别提取前8位和后8位转换成两个10进制
'数据,这两个数据就是汉字的Unicode码了,将它们赋值给一个字符型
'变量即可
'
'  由于上述的二进制数字均须进行大量的字符串操作,因此在实际的
'代码中,笔者采用了逻辑运算(位操作)来代替上述的字符串操作

            ReDim s(L)
            ReDim Preserve t(L)
            j = 0
            For i = 0 To L
                If s(i) < 128 Then
                    t(j) = Chr(s(i)): j = j + 1
                ElseIf s(i) < 224 Then
                    t(j) = ChrB((s(i) And 3) * 64 + (s(i + 1) And 63)) + ChrB((s(i) And 28) / 4): j = j + 1
                    i = i + 1
                Else
                    t(j) = ChrB((s(i + 1) And 3) * 64 + (s(i + 2) And 63)) + ChrB((s(i) And 15) * 16 + (s(i + 1) And 60) / 4): j = j + 1
                    i = i + 2
                End If
            Next

            For i = 1 To L
                c = Mid(s, i, 1)
                If Asc(c) > 0 Then
                    b = Asc(c)
                    bytes = bytes + 1: ReDim Preserve t(bytes): t(bytes) = b
                Else
                    If 0 < AscW(c) And AscW(c) < 2048 Then
                        hexstr = Right("0000" + Hex(AscW(c)), 4)
                        h(0) = Val("&H" + Mid(hexstr, 3, 2))
                        h(1) = Val("&H" + Mid(hexstr, 1, 2))
                        b = 192 + h(1) * 4 + (h(0) And 192) / 64
                        bytes = bytes + 1: ReDim Preserve t(bytes): t(bytes) = b
                        b = 128 + (h(0) And 63)
                        bytes = bytes + 1: ReDim Preserve t(bytes): t(bytes) = b
                    Else
                        hexstr = Right("0000" + Hex(AscW(c)), 4)
                        h(0) = Val("&H" + Mid(hexstr, 3, 2))
                        h(1) = Val("&H" + Mid(hexstr, 1, 2))
                        b = (h(1) And 240) / 16 Or 224
                        bytes = bytes + 1: ReDim Preserve t(bytes): t(bytes) = b
                        b = (h(1) And 15) * 4 + ((h(0) And 192) / 64) Or 128
                        bytes = bytes + 1: ReDim Preserve t(bytes): t(bytes) = b
                        b = h(0) And 63 Or 128
                        bytes = bytes + 1: ReDim Preserve t(bytes): t(bytes) = b
                    End If
                End If
            Next
--------------------编程问答-------------------- 服务器端使用JAVA写的一个接收servlet(别人提供的,无法修改),客户端是VB6.0编写的
而服务器端接收的编码格式是UTF-8的,所以我这边发送时必须将发送数据转换成UTF-8格式
最好给我一个转换函数,意思就是可以将VB6.0内部编码转换成为UTF-8编码的 --------------------编程问答-------------------- 这个帖子的 EncodeUTF8NoBOM()
http://topic.csdn.net/u/20091125/07/29565bd6-bfd6-40ac-a332-eb33275eaf57.html

这个帖子的 StrFromUtf8()
http://topic.csdn.net/u/20091125/07/29565bd6-bfd6-40ac-a332-eb33275eaf57.html
补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,