UTF-8使用纯真IP数据库乱码问题(已解决)

最近手头在写一个根据IP地址返回省份地区的代码,发现在使用纯真ip数据库的时候出现乱码,最后发现纯真数据库是居于GBK编码的,而我的整个工程编码都是采用的UTF-8编码,两个走到一起肯定会出现乱码,所以只能改写纯真读取ip的类

[plain][/plain]

view plaincopyprint?

  1. <%
  2. ‘得到访问者IP
  3. public Function getip()
  4.         Dim strIPAddr
  5.         If Request.ServerVariables(“HTTP_X_FORWARDED_FOR”) = “” OR InStr(Request.ServerVariables(“HTTP_X_FORWARDED_FOR”), “unknown”) > 0 Then
  6.             strIPAddr = Request.ServerVariables(“REMOTE_ADDR”)
  7.         ElseIf InStr(Request.ServerVariables(“HTTP_X_FORWARDED_FOR”), “,”) > 0 Then
  8.             strIPAddr = Mid(Request.ServerVariables(“HTTP_X_FORWARDED_FOR”), 1, InStr(Request.ServerVariables(“HTTP_X_FORWARDED_FOR”), “,”)-1)
  9.             actforip=Request.ServerVariables(“REMOTE_ADDR”)
  10.         ElseIf InStr(Request.ServerVariables(“HTTP_X_FORWARDED_FOR”), “;”) > 0 Then
  11.             strIPAddr = Mid(Request.ServerVariables(“HTTP_X_FORWARDED_FOR”), 1, InStr(Request.ServerVariables(“HTTP_X_FORWARDED_FOR”), “;”)-1)
  12.             actforip=Request.ServerVariables(“REMOTE_ADDR”)
  13.         Else
  14.             strIPAddr = Request.ServerVariables(“HTTP_X_FORWARDED_FOR”)
  15.             actforip=Request.ServerVariables(“REMOTE_ADDR”)
  16.         End If
  17.         getip = Trim(Mid(strIPAddr, 1, 30))
  18. End Function
  19. ‘ ============================================
  20. ‘ 返回IP地区信息
  21. ‘ ============================================
  22. Function Look_Ip(IP)
  23.  Dim Wry, IPType, QQWryVersion, IpCounter
  24.  ‘ 设置类对象
  25.  Set Wry = New TQQWry
  26.  ‘ 开始搜索,并返回搜索结果
  27.  ‘ 您可以根据 QQWry(IP) 返回值来判断该IP地址在数据库中是否存在,如果不存在可以执行其他的一些操作
  28.  ‘ 比如您自建一个数据库作为追捕等,这里我就不详细说明了
  29.  IPType = Wry.QQWry(IP)
  30.  ‘ Country:国家地区字段
  31.  ‘ LocalStr:省市及其他信息字段
  32.  Look_Ip = Wry.Country & ” ” & Wry.LocalStr
  33. End Function
  34. ‘ ============================================
  35. ‘ 返回QQWry信息
  36. ‘ ============================================
  37. Function WryInfo()
  38.  Dim Wry, IPType, QQWry(1)
  39.  ‘ 设置类对象
  40.  Set Wry = New TQQWry
  41.  IPType = Wry.QQWry(“255.255.255.255”)
  42.  ‘ 读取数据库版本信息
  43.  QQWry(0) = Wry.Country & ” ” & Wry.LocalStr
  44.  ‘ 读取数据库IP地址数目
  45.  QQWry(1) = Wry.RecordCount + 1
  46.  WryInfo = QQWry
  47. End Function
  48. ‘ ============================================
  49. ‘ IP物理定位搜索类
  50. ‘ ============================================
  51. Class TQQWry
  52.  ‘ ============================================
  53.  ‘ 变量声名
  54.  ‘ ============================================
  55.  Dim Country, LocalStr, Buf, OffSet
  56.  Private StartIP, EndIP, CountryFlag
  57.  Public QQWryFile
  58.  Public FirstStartIP, LastStartIP, RecordCount
  59.  Private Stream, EndIPOff
  60.  ‘ ============================================
  61.  ‘ 类模块初始化
  62.  ‘ ============================================
  63.  Private Sub Class_Initialize
  64.   Country = “”
  65.   LocalStr = “”
  66.   StartIP = 0
  67.   EndIP = 0
  68.   CountryFlag = 0
  69.   FirstStartIP = 0
  70.   LastStartIP = 0
  71.   EndIPOff = 0
  72.   QQWryFile = Server.MapPath(“/yxgame/date/qqwry.dat”) ‘QQ IP库路径,要转换成物理路径
  73.  End Sub
  74.  ‘ ============================================
  75.  ‘ IP地址转换成整数 ip
  76.   ‘ ============================================
  77.  Function IPToInt(IP)
  78.   If Instr(IP,”:”)>0 Then IP=”127.0.0.1″ ‘当IP地址是::1这样的地址时返回本机地址
  79.   Dim IPArray, i
  80.   IPArray = Split(IP, “.”, -1)
  81.   FOr i = 0 to 3
  82.   If Not IsNumeric(IPArray(i)) Then IPArray(i) = 0
  83.   If CInt(IPArray(i)) < 0 Then IPArray(i) = Abs(CInt(IPArray(i)))
  84.   If CInt(IPArray(i)) > 255 Then IPArray(i) = 255
  85.   Next
  86.   IPToInt = (CInt(IPArray(0))*256*256*256) + (CInt(IPArray(1))*256*256) + (CInt(IPArray(2))*256) + CInt(IPArray(3))
  87.  End Function
  88.  ‘ ============================================
  89.  ‘ 整数逆转IP地址
  90.  ‘ ============================================
  91.  Function IntToIP(IntValue)
  92.   p4 = IntValue – Fix(IntValue/256)*256
  93.   IntValue = (IntValue-p4)/256
  94.   p3 = IntValue – Fix(IntValue/256)*256
  95.   IntValue = (IntValue-p3)/256
  96.   p2 = IntValue – Fix(IntValue/256)*256
  97.   IntValue = (IntValue – p2)/256
  98.   p1 = IntValue
  99.   IntToIP = Cstr(p1) & “.” & Cstr(p2) & “.” & Cstr(p3) & “.” & Cstr(p4)
  100.  End Function
  101.  ‘ ============================================
  102.  ‘ 获取开始IP位置
  103.  ‘ ============================================
  104.  Private Function GetStartIP(RecNo)
  105.   OffSet = FirstStartIP + RecNo * 7
  106.   Stream.Position = OffSet
  107.   Buf = Stream.Read(7)
  108.   EndIPOff = AscB(MidB(Buf, 5, 1)) + (AscB(MidB(Buf, 6, 1))*256) + (AscB(MidB(Buf, 7, 1))*256*256)
  109.   StartIP = AscB(MidB(Buf, 1, 1)) + (AscB(MidB(Buf, 2, 1))*256) + (AscB(MidB(Buf, 3, 1))*256*256) + (AscB(MidB(Buf, 4, 1))*256*256*256)
  110.   GetStartIP = StartIP
  111.  End Function
  112.  ‘ ============================================
  113.  ‘ 获取结束IP位置
  114.  ‘ ============================================
  115.  Private Function GetEndIP()
  116.   Stream.Position = EndIPOff
  117.   Buf = Stream.Read(5)
  118.   EndIP = AscB(MidB(Buf, 1, 1)) + (AscB(MidB(Buf, 2, 1))*256) + (AscB(MidB(Buf, 3, 1))*256*256) + (AscB(MidB(Buf, 4, 1))*256*256*256)
  119.   CountryFlag = AscB(MidB(Buf, 5, 1))
  120.   GetEndIP = EndIP
  121.  End Function
  122.  ‘ ============================================
  123.  ‘ 获取地域信息,包含国家和和省市
  124.  ‘ ============================================
  125.  Private Sub GetCountry(IP)
  126.   If (CountryFlag = 1 or CountryFlag = 2) Then
  127.   Country = GetFlagStr(EndIPOff + 4)
  128.   If CountryFlag = 1 Then
  129.   LocalStr = GetFlagStr(Stream.Position)
  130.   ‘ 以下用来获取数据库版本信息
  131.   If IP >= IPToInt(“255.255.255.0”) And IP <= IPToInt(“255.255.255.255”) Then
  132.   LocalStr = GetFlagStr(EndIPOff + 21)
  133.   Country = GetFlagStr(EndIPOff + 12)
  134.   End If
  135.   Else
  136.   LocalStr = GetFlagStr(EndIPOff + 8)
  137.   End If
  138.   Else
  139.   Country = GetFlagStr(EndIPOff + 4)
  140.   LocalStr = GetFlagStr(Stream.Position)
  141.   End If
  142.   ‘ 过滤数据库中的无用信息
  143.   Country = Trim(Country)
  144.   LocalStr = Trim(LocalStr)
  145.   If InStr(Country, “CZ88.NET”) Then Country = “本地/局域网”
  146.   If InStr(LocalStr, “CZ88.NET”) Then LocalStr = “本地/局域网”
  147.  End Sub
  148.  ‘ ============================================
  149.  ‘ 获取IP地址标识符
  150.  ‘ ============================================
  151.  Private Function GetFlagStr(OffSet)
  152.   Dim Flag
  153.   Flag = 0
  154.   Do While (True)
  155.   Stream.Position = OffSet
  156.   Flag = AscB(Stream.Read(1))
  157.   If(Flag = 1 or Flag = 2 ) Then
  158.   Buf = Stream.Read(3)
  159.   If (Flag = 2 ) Then
  160.   CountryFlag = 2
  161.   EndIPOff = OffSet – 4
  162.   End If
  163.   OffSet = AscB(MidB(Buf, 1, 1)) + (AscB(MidB(Buf, 2, 1))*256) + (AscB(MidB(Buf, 3, 1))*256*256)
  164.   Else
  165.   Exit Do
  166.   End If
  167.   Loop
  168.   If (OffSet < 12 ) Then
  169.   GetFlagStr = “”
  170.   Else
  171.   Stream.Position = OffSet
  172.   GetFlagStr = GetStr()
  173.   End If
  174.  End Function
  175.  ‘ ============================================这里获取代码最关键了
  176.  ‘ 获取字串信息 (www.viming.com)
  177.  ‘—–utf-8———–
  178.  Private Function GetStr()
  179.   dim c
  180.   getstr = “”
  181.   dim objstream
  182.   set objstream = server.createobject(“adodb.stream”)
  183.   objstream.type = 1
  184.   objstream.mode =3
  185.   objstream.open
  186.   c = stream.read(1)
  187.   do while (ascb(c)<>0 and not stream.eos)
  188.   objstream.write c
  189.   c = stream.read(1)
  190.   loop
  191.   objstream.position = 0
  192.   objstream.type = 2
  193.   objstream.charset = “gb2312”
  194.   getstr = objstream.readtext
  195.   objstream.close
  196.   set objstream = nothing
  197.  End Function
  198.  ‘ ============================================
  199.  ‘ 核心函数,执行IP搜索
  200.  ‘ ============================================
  201.  Public Function QQWry(DotIP)
  202.   Dim IP, nRet
  203.   Dim RangB, RangE, RecNo
  204.   IP = IPToInt (DotIP)
  205.   Set Stream = CreateObject(“ADodb.Stream”)
  206.   Stream.Mode = 3
  207.   Stream.Type = 1
  208.   Stream.Open
  209.   Stream.LoadFromFile QQWryFile
  210.   Stream.Position = 0
  211.   Buf = Stream.Read(8)
  212.   FirstStartIP = AscB(MidB(Buf, 1, 1)) + (AscB(MidB(Buf, 2, 1))*256) + (AscB(MidB(Buf, 3, 1))*256*256) + (AscB(MidB(Buf, 4, 1))*256*256*256)
  213.   LastStartIP = AscB(MidB(Buf, 5, 1)) + (AscB(MidB(Buf, 6, 1))*256) + (AscB(MidB(Buf, 7, 1))*256*256) + (AscB(MidB(Buf, 8, 1))*256*256*256)
  214.   RecordCount = Int((LastStartIP – FirstStartIP)/7)
  215.   ‘ 在数据库中找不到任何IP地址
  216.   If (RecordCount <= 1) Then
  217.   Country = “未知”
  218.   QQWry = 2
  219.   Exit Function
  220.   End If
  221.   RangB = 0
  222.   RangE = RecordCount
  223.   Do While (RangB < (RangE – 1))
  224.   RecNo = Int((RangB + RangE)/2)
  225.   Call GetStartIP (RecNo)
  226.   If (IP = StartIP) Then
  227.   RangB = RecNo
  228.   Exit Do
  229.   End If
  230.   If (IP > StartIP) Then
  231.   RangB = RecNo
  232.   Else
  233.   RangE = RecNo
  234.   End If
  235.   Loop
  236.   Call GetStartIP(RangB)
  237.   Call GetEndIP()
  238.   If (StartIP <= IP) And ( EndIP >= IP) Then
  239.   ‘ 没有找到
  240.   nRet = 0
  241.   Else
  242.   ‘ 正常
  243.   nRet = 3
  244.   End If
  245.   Call GetCountry(IP)
  246.   QQWry = nRet
  247.  End Function
  248.  ‘ ============================================
  249.  ‘ 类终结
  250.  ‘ ============================================
  251.  Private Sub Class_Terminate
  252.   On ErrOr Resume Next
  253.   Stream.Close
  254.   If Err Then Err.Clear
  255.   Set Stream = Nothing
  256.  End Sub
  257. End Class
  258. %>
          最后就简单了,到需要用到显示的地方只需调用 look_ip()这个函数就可以了,哈哈。
哎……我去,都凌晨了,苦逼!!!!睡了,幸亏明天是周六!休息休息!!!!

标签