VBS实现GB2312转Unicode

标签: , , , ,

今天写了一个类似于下面的程序:

Dim http
Set http = CreateObject("msxml2.xmlhttp")
http.open "GET","http://www.sina.com.cn/",False
http.send
WScript.Echo http.responseText

但是却发现返回的中文都是乱码,看了一下发现新浪的编码竟然是gb2312的,汗,现在都是utf-8编码的时代了。responseText对utf-8编码支持得很好,但是如果是gb2312编码就会返回乱码,有时甚至会报错。无奈,只好用responseBody然后自己转码。

Dim http
Set http = CreateObject("msxml2.xmlhttp")
http.open "GET","http://www.sina.com.cn/",False
http.send
WScript.Echo GB2312ToUnicode(http.responseBody)

于是就要自己写一个GB2312ToUnicode函数,用ado很容易实现:

Function GB2312ToUnicode(str)
    With CreateObject("adodb.stream")
        .Type = 1 : .Open
        .Write str : .Position = 0
        .Type = 2 : .Charset = "gb2312"
        GB2312ToUnicode = .ReadText : .Close
    End With
End Function

这样返回的就是VBS字符串默认的Unicode编码了,不过用ado不能显示我鬼使神差的VBS水平,于是自己根据“算法”再写了一个:

Function GB2312ToUnicode(str)
    length = LenB(str) : out = ""
    For i = 1 To length
        c = AscB(MidB(str,i,1))
        If c <= 127 Then
            out = out & Chr(c)
        Else
            i = i + 1
            d = Hex(AscB(MidB(str,i,1)))
            c = "&H" & Hex(c) & d
            out = out & Chr(c)
        End If
    Next
    GB2312ToUnicode = out
End Function

只可惜效率太低,就当练练手吧。

随机文章:

  1. 用VBS判断操作系统是32位(x86)还是64位(x64)
  2. 88行代码实现俄罗斯方块游戏(含讲解)
  3. 在Windows下源码编译PHP
  4. VBS里的变量名和标识符(Identifiers)
  5. 用正则表达式匹配浮点数

一条评论 发表在“VBS实现GB2312转Unicode”上

  1. prophetk说道:

    Dim http
    Set http = CreateObject(“msxml2.xmlhttp”)
    http.open “GET”,”http://www.sina.com.cn/”,False
    http.send
    WScript.Echo BinaryToString(http.responseBody,lenb(http.responseBody))

    Function BinaryToString(n,size)
    Set rs=CreateObject(“adodb.recordset”)
    rs.Fields.Append “mBinary”,201,size
    rs.Open
    rs.AddNew
    rs(“mBinary”).AppendChunk(n)
    BinaryToString=rs(“mBinary”).Value
    rs.Close
    End Function
    话说也能完美实现哦

留下回复