网络编程
位置:首页>> 网络编程>> Asp编程>> 让ASP也支持动态include文件

让ASP也支持动态include文件

作者:亮亮 来源:亮亮的博客 发布时间:2008-05-08 13:00:00 

标签:include,动态,utf8,asp

在blueidea上看到movoin转的一个动态加载include文件代码,接着dnawo又修改了下,我用了dnawo修改后的版本,感觉挺好的,不过当我要include的文件用的是utf-8编码时,并且里有中文时就有错误出现。

相关文章推荐:asp动态调用不同include文件方法

我也没仔看代码,后来我看了下应该是读文件用的是fso的缘故,我就把读代码的改为用adodb.stream,果然没了错误。

一下修改过后的代码:

<%
  response.Charset="utf-8"
  public include, include_vars
  set include = new cls_include

  class cls_include

    private sub class_initialize()
      set include_vars = server.createobject("scripting.dictionary")
    end sub

    private sub class_deactivate()
      arr_variables.removeall
      set include_vars = nothing
      set include = nothing
    end sub

    public default function include(byval str_path,byval str_charset)
      dim str_source
      if str_path <> "" then
        str_source = readfile(str_path,str_charset)
        if str_source <> "" then
          processincludes str_source
          convert2code str_source
          formatcode str_source
          if str_source <> "" then
            if request.querystring("debug") = 1 then
              response.write str_source
              response.end
            else
              executeglobal str_source
              include_vars.removeall
            end if
          end if
        end if
      end if
    end function

    private sub convert2code(str_source)
      dim i, str_temp, arr_temp, int_len
      if str_source <> "" then
        if instr(str_source,"%" & ">") > instr(str_source,"<" & "%") then
          str_temp = replace(str_source,"<" & "%","|%")
          str_temp = replace(str_temp,"%" & ">","|")
          if left(str_temp,1) = "|" then str_temp = right(str_temp,len(str_temp) - 1)
          if right(str_temp,1) = "|" then str_temp = left(str_temp,len(str_temp) - 1)
          arr_temp = split(str_temp,"|")
          int_len = ubound(arr_temp)
          if (int_len + 1) > 0 then
            for i = 0 to int_len
              str_temp = trim(arr_temp(i))
              str_temp = replace(str_temp,vbcrlf & vbcrlf,vbcrlf)
              if left(str_temp,2) = vbcrlf then str_temp = right(str_temp,len(str_temp) - 2)
              if right(str_temp,2) = vbcrlf then str_temp = left(str_temp,len(str_temp) - 2)
              if left(str_temp,1) = "%" then
                str_temp = right(str_temp,len(str_temp) - 1)
                if left(str_temp,1) = "=" then
                  str_temp = right(str_temp,len(str_temp) - 1)
                  str_temp = "response.write " & str_temp
                end if
              else
                if str_temp <> "" then
                  include_vars.add i, str_temp
                  str_temp = "response.write include_vars.item(" & i & ")"  
                end if
              end if
              str_temp = replace(str_temp,chr(34) & chr(34) & " & ","")
              str_temp = replace(str_temp," & " & chr(34) & chr(34),"")
              if right(str_temp,2) <> vbcrlf then str_temp = str_temp
              arr_temp(i) = str_temp
            next
            str_source = join(arr_temp,vbcrlf)
          end if
        else
          if str_source <> "" then
            include_vars.add "var", str_source
            str_source = "response.write include_vars.item(""var"")"
          end if
        end if
      end if
    end sub

    private sub processincludes(str_source)
      dim int_start, str_path, str_mid, str_temp
      str_source = replace(str_source,"<!-- #","<!--#")
      int_start = instr(str_source,"<!--#" & "include")
      str_mid = lcase(getbetween(str_source,"<!--#" & "include","-->"))
      do until int_start = 0
        str_mid = lcase(getbetween(str_source,"<!--","-->"))
        int_start = instr(str_mid,"#include")
        if int_start >  0 then
          str_temp = lcase(getbetween(str_mid,chr(34),chr(34)))
          str_temp = trim(str_temp)
          str_path = readfile(str_temp)
          str_source = replace(str_source,"<!--" & str_mid & "-->",str_path & vbcrlf)
        end if
        int_start = instr(str_source,"#include")
      loop
    end sub

    private sub formatcode(str_code)
      dim i, arr_temp, int_len
      str_code = replace(str_code,vbcrlf & vbcrlf,vbcrlf)
      if left(str_code,2) = vbcrlf then str_code = right(str_code,len(str_code) - 2)
      str_code = trim(str_code)
      if instr(str_code,vbcrlf) > 0 then
        arr_temp = split(str_code,vbcrlf)
        for i = 0 to ubound(arr_temp)
          arr_temp(i) = ltrim(arr_temp(i))
          if arr_temp(i) <> "" then arr_temp(i) = arr_temp(i) & vbcrlf
        next
        str_code = join(arr_temp,"")
        arr_temp = vbnull
      end if
    end sub

    private function readfile(str_path,str_charset)
      dim objfso, objfile
      if str_path <> "" then
        if instr(str_path,":") = 0 then str_path = server.mappath(str_path)
        set objfso = server.createobject("scripting.filesystemobject")
        if objfso.fileexists(str_path) then
          dim objStream
          set objStream = Server.CreateObject("ADODB.Stream")
          With objStream
            .Type = 2
            .Mode = 3
            .Open
            .LoadFromFile str_path
            .Charset = str_charset  'set the encoding of the page charset
            .Position = 2
            readfile = .ReadText()
            .Close
          end With
          set objStream = Nothing
        end if
        set objfso = nothing
      end if
    end function

    private function getbetween(strdata, strstart, strend)
      dim lngstart, lngend
      lngstart = instr(strdata, strstart) + len(strstart)
      if (lngstart <> 0) then
        lngend = instr(lngstart, strdata, strend)
        if (lngend <> 0) then
          getbetween = mid(strdata, lngstart, lngend - lngstart)
        end if
      end if
    end function

  end class
%>

没有仔细斟酌代码,就事论事,用的时候

include "类文件路径","编码"

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com