确定ASP脚本中UTF-8响应的长度

时间:2013-12-09 20:19:38

标签: http asp-classic

我有很多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
%>

1 个答案:

答案 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