我有很多PHP脚本,我试图移植到ASP。这些脚本查询数据库,并以UTF-8格式显示结果。这适用于PHP,但ASP似乎有UTF-8问题,并且IIS似乎一般都有内容长度问题。
在ASP方面,没有简单的方法来获取UTF-8字符串的大小(以字节为单位)。 ASP仅处理UTF-16和字节。鉴于VBA代码以VBScript而不是VB6运行,我也无法进行任何Windows API调用。
在IIS端,如果内容长度太小,响应将被截断,如果脚本太大,则脚本会崩溃。但当然,如果我能计算出正确的长度,那也没关系。
我应该指出,UTF-8的所有其他方面都能正常运行。脚本显示正确的响应,只是它们没有正确的内容长度。如果我只使用ANSI数据,并使用Len函数来获取长度,那么一切都很好。
关心一些代码?很好,这是我到目前为止的简化版本:
<% @CodePage=65001 Language="VBScript"
Dim data
'设置数据以纠正UTF-16值
Response.Clear
Response.AddHeader "Content-Type", "text/plain"
Response.AddHeader "Content-Length", CStr(Len(data))
Response.Write(data)
Response.Flush
%>
答案 0 :(得分:0)
来自RFC
Content-Length实体标题字段指示的大小 entity-body,以十进制数字表示的OCTET,发送给收件人或者 HEAD方法的情况,即实体的大小 如果请求是GET,则已被发送。
八位字节数。
已编辑 - 解释我的观点
错误。 我错了。好吧,或多或少。
utf-8与否,Content-Length仅表示线路中八位字节的数量(术语字节在不同系统中具有不同的含义)。期。
但是,我没有看到的是你没有发送纯粹的utf-8数据,而是留给webserver / scripting引擎转换到数据输出上相应的charset / codepage。
如何处理?如果您按照示例代码显示的方式进行操作,则可以使用以下函数更改Len(Data)
utf8Len(Data)
:
Function utf8Len( text )
utf8Len = 0
' Only strings with data
If VarType( text ) <> 8 Then Exit Function
If Len( text ) < 1 Then Exit Function
' Create an ADODB.Stream object to handle charset conversion
With (CreateObject("ADODB.Stream"))
' Define characteristics of the stream
.Type = 2 '( adTypeText )
.Charset = "utf-8"
' Put data into the stream
.Open
.WriteText text
.Flush
' Get the length of the stream without BOM
utf8Len = .Size - 3
' Close the stream
.Close
End With
End Function
对于.Net替代方案,可以使用
Function utf8Len( text )
utf8Len = 0
' Only strings with data
If VarType( text ) <> 8 Then Exit Function
If Len( text ) < 1 Then Exit Function
utf8Len = LenB(CreateObject("System.Text.UTF8Encoding").GetBytes_4(text))
End Function