热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ASP文件编码格式与Server.URLEncode

最近在修改一个遗产程序,因为要下载文件,而这些文件大部分都是以中文命名的,中文的处理对于一些新兴的语言,比如Java,.net什么的都没有问题,可是这是个asp程序。当我把asp文件采用

最近在修改一个遗产程序,因为要下载文件,而这些文件大部分都是以中文命名的,中文的处理对于一些新兴的语言,比如Java,.net什么的都没有问题,可是这是个 asp 程序。
当我把asp文件采用本地编码时,Server.URLEncode就会使用本地编码来处理,而当我使用UTF-8编码来保存asp文件的时候,它也会自动的采用UTF-8来处理Server.URLEncode,也就是说:
那我的姓“周”举例子吧:
GBK____%D6%DC_____0xD6DC(55004)
UTF-8__%E5%91%A8__U+5468(21608)__周

从上面我们可以看到,当我的asp文件保存成ansi格式的时候,URLEncode就会输出%D6%DC,当我把asp文件保存成UTF-8的时候,它就会输出%E5%91%A8。

而apache,iis处理URLEncode的时候都是使用的UTF-8处理的,可是这个遗产程序是GBK编码的,我不可能仅仅修改那一个asp文件的编码为UTF-8,因为这样那些有bug的IE在页面切换的时候就会发生混乱。而且当我打算把整个程序的asp文件都转成UTF-8的时候,我发现Vbscript中的文件输出对UTF-8的支持又很差,虽然我后来找到了输出的解决方法,但是我要测试几乎所有的页面,那是一件很痛苦的事情,调试过asp的人都知道,那莫名其妙的500错误,会让你焦头烂额的,如果不是那些对asp由极大的热情和经验,你根本做不下去。我就是这样的,没有热情,甚至有些讨厌,而且没有足够的经验,它的那些函数的记忆简直比记忆英语单词还难(我好像用错句型了,本来就是比英文单词的记忆还难的)。

所以我期望能够有一个像 java.net.URLEncoder.encode(myString, "UTF-8") 这样的函数,基于我对Vbscript的数量程度不够,我都快把搜索引擎搜趴下了(^_^),都没有找到我想要的,后来,我准备根据java代码来写一个Vbscript的实现,可是当我看到十几行的java代码后我退缩了,不是因为我害怕java代码,而是我清楚我对Vbscript的了解,我无法在一天的时间内完成。

最终我想到了一个不是方法的方法,我打算采用字典的形式来达到目的:

我先用java生成字典:

import java.io.*;

public class T {
  public static void main(String[] args) throws Exception {
    FileOutputStream fos = new FileOutputStream("C://URLEncoding.txt");
    OutputStreamWriter w = new OutputStreamWriter(fos, "iso-8859-1");
    String s = null;
    for (int i = 0; i <= 0xFFFF; i++) {
      s = "" + (char) i;
      w.write(i + "=" + java.net.URLEncoder.encode(s, "UTF-8"));
      w.write("/r/n");
    }
    w.close();
    fos.close();
  }
}

然后用ASP查询字典来进行URLEncode(下面这段是柠檬( http://3rgb.com)帮忙写的):

<%

dim arrDic
Dim objFSO,objFile,strTemplate,strFileName
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(Server.MapPath("./") & "/URLEncoding.txt", 1)
strSource = objFile.ReadAll
set objFSO = nothing
set objFile = nothing
arrDic = split(strSource, vbcrlf)

Function utfoutstr(str)
dim i,j,k,cc,dd,outStr,utfStr
j = Ubound(arrDic) - 1
for k = 1 to len(str)
 cc = ascw(mid(str,k,1))
 for i = 0 to j
 dd = split(arrDic(i),"=")
  if clng(cc) = clng(dd(0)) then
   utfStr = dd(1)
   exit for
  end if
 next
outStr = outStr & utfStr
next
utfoutstr = outStr
end function

 

with response
'.write Ubound(arrDic)
.write utfoutstr("周树群")

end with

%>

哦,天那,这就是我的最终代码,我发现效果不错。

哦,天那,这就是我的最终代码,我发现效果不错。

不过最后我用到我的程序中发现,压根不管用。

因为编码后的东西是作为参数传给Response.Redirect的,虽然我替换了:,/,.三个符号,还是报错,我猜测是因为Response.Redirect会自己调用Server.URLEncode或者做相似的处理。

我放弃了,我不用改了。

不过我明白了一些函数,chrW,ascW之类的。

也知道了确信了,以后再也不用asp的坚定信念,妈呀,简直噩梦。

几个有用的参考:
http://www.shaoys.com/testart/ShowThesis.asp?DocID=Y2004M11D04H05m12s05
http://blog.csdn.net/daviva/archive/2004/09/21/111564.aspx


推荐阅读
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
author-avatar
mobiledu2502862267
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有