gpt4 book ai didi

iis-7 - ASP Classic 应用程序中的 Multipart/form-data 和 UTF-8

转载 作者:行者123 更新时间:2023-12-04 14:52:56 25 4
gpt4 key购买 nike

我有一个我真的不明白的问题。
我正在尝试在 asp 经典应用程序中上传文件,而不使用外部组件。我还想发布一些将存储在数据库中的文本。
文件上传完美,我正在使用此代码:Upload Files Without COM v3 by Lewis E. Moten III

问题是其他表单输入字段。我正在使用 UTF-8,但它们最终不会成为 UTF-8。即,如果我使用 Response.Write 打印出来,瑞典字符 å ä 和 ö 将显示为问号。

我已将文件保存为 UTF-8(带 BOM),并添加了元标记来告诉页面它是 UTF-8。我已经设置了 Response.CharSet = "UTF-8"。

从二进制转换为字符串的函数看起来像这样(这是我能想到的唯一可能错误的地方,因为注释说它提取 ANSI 字符,但我认为它应该提取 Unicode 字符):

Private Function CStrU(ByRef pstrANSI)

' Converts an ANSI string to Unicode
' Best used for small strings

Dim llngLength ' Length of ANSI string
Dim llngIndex ' Current position

' determine length
llngLength = LenB(pstrANSI)

' Loop through each character
For llngIndex = 1 To llngLength

' Pull out ANSI character
' Get Ascii value of ANSI character
' Get Unicode Character from Ascii
' Append character to results
CStrU = CStrU & Chr(AscB(MidB(pstrANSI, llngIndex, 1)))

Next

End Function

我已经创建了一个测试 asp 页面 (multiparttest.asp) 来复制它,需要从 Lewis E. Moten 上传的东西才能使它工作(我已经将他的文件添加到了一个名为 upload 的子目录中)。
<%Response.CharSet = "UTF-8" %>
<!--#INCLUDE FILE="upload/clsUpload.asp"-->
<html>
<head>
<title>Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<%
Set objUpload = New clsUpload
Response.Write( objUpload.Fields("testInput").Value )
%>
<form method="post" enctype="multipart/form-data" action="multiparttest.asp">
<input type="text" name="testInput" />
<input type="submit" value="submit" />
</form>

</body>
</html>

我已经在 Firefox 中使用 LiveHTTP header 捕获了请求,并将其保存为 UTF-8 文件,瑞典字符看起来应该是(它们在 LiveHTTP header GUI 中看起来不太好,但我猜它的 GUI self 没有使用正确的编码)。这是 POST 请求的样子:
http://localhost/testsite/multiparttest.asp

POST /testsite/multiparttest.asp HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost/testsite/multiparttest.asp
Cookie: ASPSESSIONIDASBBRBTT=GLDJDBJALAMJFBFBDCCIONHF; ASPSESSIONIDAQABQBTT=DIPHILKAIICKJOIAIMILAMGE; ASPSESSIONIDCSABTCQS=KMHBLBLABKHCBGPNLMCIPPNJ
Content-Type: multipart/form-data; boundary=---------------------------7391102023625
Content-Length: 150
-----------------------------7391102023625
Content-Disposition: form-data; name="testInput"

åäö
-----------------------------7391102023625--

HTTP/1.x 200 OK
Cache-Control: private
Content-Length: 548
Content-Type: text/html; Charset=UTF-8
Server: Microsoft-IIS/7.0
X-Powered-By: ASP.NET
Date: Tue, 10 Nov 2009 14:20:17 GMT
----------------------------------------------------------

在这方面的任何帮助表示赞赏!

编辑 10/11:

我试图将所有这些添加到 asp 文件的顶部,由于我在其他地方发现的关于这个问题的不同建议,没有不同的结果..
<%@Language=VBScript codepage=65001 %>
<%Response.ContentType="text/html"%>
<%Response.Charset="UTF-8"%>
<%Session.CodePage=65001%>

编辑 11/11:

这个问题似乎相关, UTF-8 text is garbled when form is posted as multipart/form-data .但他们不使用 ASP 或 IIS。是否可以在 IIS 中为 multipart/form-data 设置某种字符编码?我正在使用 IIS7。也许我的请求毕竟有错误的编码? (我现在真的迷失在字符编码世界中)

最佳答案

您对 CStrU 的分析是正确的。它假定客户端正在发送单字节 ANSI 字符。它还假定客户端使用的代码页和运行 VBScript 的区域设置是相同的。

使用 UTF-8 时,CStrU 所做的假设总是不正确的。据我所知,没有将 65001 作为其代码页的语言环境(我认为有一两个使用 65000 的语言环境,但这又是不同的)。

这是一个假设文本是 UTF-8 的替换函数:-

 Private Function CStrU(ByRef pstrANSI)

Dim llngLength '' # Length of ANSI string
Dim llngIndex '' # Current position
Dim bytVal
Dim intChar

'' # determine length
llngLength = LenB(pstrANSI)

'' # Loop through each character
llngIndex = 1
Do While llngIndex <= llngLength

bytVal = AscB(MidB(pstrANSI, llngIndex, 1))
llngIndex = llngIndex + 1

If bytVal < &h80 Then
intChar = bytVal
ElseIf bytVal < &hE0 Then

intChar = (bytVal And &h1F) * &h40

bytVal = AscB(MidB(pstrANSI, llngIndex, 1))
llngIndex = llngIndex + 1

intChar = intChar + (bytVal And &h3f)

ElseIf bytVal < &hF0 Then

intChar = (bytVal And &hF) * &h1000

bytVal = AscB(MidB(pstrANSI, llngIndex, 1))
llngIndex = llngIndex + 1

intChar = intChar + (bytVal And &h3F) * &h40

bytVal = AscB(MidB(pstrANSI, llngIndex, 1))
llngIndex = llngIndex + 1

intChar = intChar + (bytVal And &h3F)

Else
intChar = &hBF
End If

CStrU = CStrU & ChrW(intChar)
Loop

End Function

请注意,随着 CStrU 被更正为 UTF-8,您的示例页面的输出现在看起来是错误的。将文件的代码页设置为 65001 的建议也是一项要求。由于您将发送到客户端的 CharSet 设置为“UTF-8”,因此您还需要告诉 ASP 在对使用 Response.Write 编写的文本进行编码时使用 UTF-8 代码页。

关于iis-7 - ASP Classic 应用程序中的 Multipart/form-data 和 UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1708822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com