6

本当にわからない問題があります。外部コンポーネントを使用せずに、ASP クラシック アプリでファイルをアップロードしようとしています。また、DB に保存されるテキストを投稿したいと考えています。ファイルのアップロードは完璧です。私はこのコードを使用しています: 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 ヘッダーを使用してリクエストをキャプチャし、UTF-8 ファイルとして保存しました。スウェーデン語の文字は本来あるべきように見えます (LiveHTTP ヘッダー 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:

この質問は関連しているようです。フォームが multipart/form-data として投稿されると、UTF-8 テキストが文字化けします。しかし、彼らは ASP や IIS を使用していません。IIS で multipart/form-data にある種の文字エンコーディングを設定することは可能ですか? IIS7を使用しています。結局、私のリクエストのエンコーディングが間違っているのでしょうか? (私は今、文字エンコーディングの世界で本当に迷子になっています)

4

3 に答える 3

6

CStrU の分析は正しいです。クライアントから 1 バイトの ANSI 文字が送信されていることを前提としています。また、VBScript が実行されているクライアントとロケールの両方で使用されているコードページが同じであることも前提としています。

UTF-8 を使用する場合、CStrU による仮定は常に正しくありません。私の知る限り、コードページとして 65001 を持つロケールはありません (65000 を使用するロケールが 1 つまたは 2 つあると思いますが、これもまた異なります)。

テキストが 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」に設定しているため、Response.Write を使用して記述されたテキストをエンコードするときに、ASP に UTF-8 コード ページを使用するように指示する必要もあります。

于 2009-11-11T12:54:08.657 に答える
1

これが役立つかどうかはわかりませんが、いくつかの従来のASPコードを使用して、SWFUploadユーティリティ(複数のファイルをバッチでアップロードできるFlashプラグイン)を使用しました。

ASPサンプルコードには、バイト/ユニコードデコードを分類する包括的なコードが含まれており、chr(AscB(MidB(...-おそらく2番目の例を見ると問題が明らかになる可能性があります。

于 2009-11-10T16:00:30.243 に答える
1

「昔」、私はASPUploadを使用しました。フォーム データと格闘するのに時間を費やすよりも、購入する方が安上がりでした。ASP.NET と少し似ていますが、通常のフィールドとアップロードされたファイルの両方をクエリで使用できるようにしますが、(IIRC)古いForm オブジェクトを壊します。つまり、ASPUpload から読み取ると、入力ストリームが消費され、通常のフォーム入力を使用すると失敗します。

同じアプリで両方のアプローチを使用できますが、同じページ リクエストで両方を使用することはできません。基本的に、どちらか一方を選択します (通常は着信 MIME に基づきます)。

于 2009-11-11T13:01:31.783 に答える