ASP Classic使用ShadowUpload处理希伯来文表单上传的编码错误问题
解决ASP Classic + ShadowUpload.asp希伯来文编码乱码及Stream.ReadText报错问题
问题核心
- 乱码原因:前端用UTF-8提交希伯来文,但ShadowUpload默认用系统编码(如Windows-1255)解析,编码不匹配导致乱码。
80070057报错:Stream.ReadText未指定UTF-8编码,Stream默认用系统编码读取UTF-8字节流,触发参数错误。
修复步骤
1. 全局编码配置(所有ASP页面头部)
保留以下配置,注意顺序:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%> <% Response.Charset = "UTF-8" Session.CodePage = 65001 Session.LCID = 1037 ' 希伯来语区域ID %>
2. 修改ShadowUpload.asp的编码逻辑
找到负责转换字节流为字符串的BytesToStr函数(或所有调用ADODB.Stream.ReadText的代码),显式指定UTF-8编码:
Function BytesToStr(Bytes) Dim Stream Set Stream = Server.CreateObject("ADODB.Stream") Stream.Type = 1 ' adTypeBinary Stream.Open Stream.Write Bytes Stream.Position = 0 Stream.Type = 2 ' adTypeText Stream.Charset = "UTF-8" ' 关键:强制用UTF-8解析 BytesToStr = Stream.ReadText Stream.Close Set Stream = Nothing End Function
若ShadowUpload中无单独
BytesToStr函数,直接在所有切换到文本模式的Stream对象上添加Stream.Charset = "UTF-8"。
3. 确保前端表单编码一致
- 给表单添加
accept-charset="UTF-8"属性:
<form action="forms_script.asp" method="post" enctype="multipart/form-data" accept-charset="UTF-8"> <!-- 表单字段 --> </form>
- 页面头部添加编码声明:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4. 数据库存储适配(若涉及)
- 数据库表字段用支持UTF-8的类型:如SQL Server用
NVARCHAR,MySQL用utf8mb4字符集。 - 用参数化查询插入/读取数据,避免手动拼接SQL导致编码丢失。
额外排查点
- 检查IIS站点设置:确保站点HTTP响应头的内容类型包含
charset=utf-8。 - 清理ShadowUpload中所有硬编码的非UTF-8设置(如
Charset = "windows-1255")。
内容的提问来源于stack exchange,提问作者Noam Smadja
相关产品推荐
相关产品推荐

