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开发一个通信模块,服务器端接收的编码格式是
代码中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--------------------编程问答-------------------- 服务器端使用JAVA写的一个接收servlet(别人提供的,无法修改),客户端是VB6.0编写的
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
而服务器端接收的编码格式是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 , 基础类