Multipart/form-data et de l'UTF-8 en ASP Classique de l'application
J'ai un problème que je ne comprends vraiment pas.
Je suis en train de télécharger un des fichiers en asp classique application, sans l'utilisation d'un composant externe. Je tiens également à poster du texte qui sera stockée dans une base de données.
L'upload de fichier parfaitement, je suis en utilisant ce code: Télécharger des Fichiers Sans COM v3 par Lewis E. que moten III
Le problème, c'est l'autre forme de champs d'entrée. Je suis en UTF-8, mais ils ne finissent pas comme UTF-8. I. e caractères suédois å, ä et ö est affiché sous forme d'interrogation si je les imprimer à l'aide de la Réponse.Écrire.
J'ai enregistré les fichiers en UTF-8 (avec BOM), j'ai ajouté la balise meta pour dire que la page est en UTF-8. J'ai mis la Réponse.CharSet = "UTF-8".
La fonction de convertir de binaire en chaîne ressemble à ça (c'est le seul endroit où je peux penser qui pourrait être mauvais, puisque les observations dire qu'il tire de caractères ANSI, mais je pense qu'il devrait se retirer de caractères 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
J'ai créé un test page asp (multiparttest.asp) pour répliquer à cela, le téléchargement des trucs de Lewis E. que moten est nécessaire pour le faire fonctionner (j'ai ajouté ses fichiers dans un sous répertoire appelé 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>
J'ai saisi de la demande à l'aide LiveHTTP les en-Têtes dans Firefox, et enregistré comme un fichier UTF-8, les caractères suédois dirait qu'ils devraient (ils n'ont pas l'air ok dans la LiveHTTP en-tête de l'interface, mais je devine que l'interface graphique elle-même n'utilise pas le bon encodage). C'est la façon dont la requête POST ressemble:
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
----------------------------------------------------------
Toute aide dans cette mater est apprécié!
MODIFIER 10/11:
J'ai essayé d'ajouter tous ces vers le haut du fichier asp, en raison des différentes suggestions que j'ai trouvé sur ce problème ailleurs, sans résultat différent..
<%@Language=VBScript codepage=65001 %>
<%Response.ContentType="text/html"%>
<%Response.Charset="UTF-8"%>
<%Session.CodePage=65001%>
MODIFIER 11/11:
Cette question semble liée, UTF-8 texte est tronqué lorsque le formulaire est affiché en tant que " multipart/form-data. Mais ils n'utilisent pas d'ASP ou IIS. Est-il possible de mettre en place un type de codage de caractères pour multipart/form-data dans IIS? Je suis l'aide de IIS7. Peut-être que ma demande n'ont pas l'encodage approprié, après tout? (Je suis vraiment perdu dans l'encodage des caractères monde maintenant)
OriginalL'auteur fredrik | 2009-11-10
Vous devez vous connecter pour publier un commentaire.
Votre analyse de CStrU est correct. Il suppose que seul octet caractères ANSI sont envoyés par le client. Il suppose également que la page de codes utilisés par le client et les paramètres régionaux que le VBScript est en cours d'exécution sont les mêmes.
Lors de l'utilisation de l'UTF-8, les hypothèses formulées par CStrU sera toujours incorrect. Il n'y a pas, à ma connaissance, les paramètres régionaux qui a 65001 que sa page de codes (je pense qu'il y a un ou deux qui utilisent 65000 mais c'est encore différent).
Ici est une fonction de remplacement qui suppose que le texte est en UTF-8:-
Noter qu'avec CStrU être corrigé pour l'UTF-8 à la sortie de votre page d'exemple maintenant regarde mal. Les conseils pour définir la page de Code du fichier à 65001 est aussi une exigence. Puisque vous êtes le réglage du jeu de caractères envoyé au client afin de "UTF-8" vous devez aussi dire ASP utilisation de l'UTF-8 code de la page lors de l'encodage de texte écrit à l'aide de la Réponse.Écrire.
OriginalL'auteur AnthonyWJones
Je ne sais pas si ce sera une aide, mais j'ai travaillé avec certains ASP classique code pour utiliser le SWFUpload utilitaire (plugin Flash qui permet à de multiples téléchargements de fichiers dans un lot).
L'AEP exemple de code comprend certains code complet qui trie les Octets Unicode/décodage, et ressemble à ce que vous mentionnez concernant chr(AscB(MidB(... - peut-être voir un deuxième exemple pourrait jeter de la lumière sur votre problème.
OriginalL'auteur Kristen
"retour dans la journée", j'ai utilisé ASPUpload. Il était moins cher d'acheter que de passer du temps de combat avec des données de formulaire. Un peu comme ASP.NET il rend à la fois les champs standard et les fichiers téléchargés pour la requête, mais il n' (IIRC) briser le vieux Forme de l'objet - c'est à dire une fois que vous avez lu à partir de ASPUpload, le flux d'entrée sera consommé, et d'essayer d'utiliser régulière entrées d'un formulaire échoue.
Vous pouvez utiliser les deux approches dans la même application - il suffit de ne pas les deux au cours de la même demande de page; choisir l'un ou l'autre, fondamentalement (généralement basée sur le MIME entrant).
Vieux entrées d'un formulaire serait cassé de toute façon lors du téléchargement d'un fichier. Le Formulaire ASP objet ne sait pas comment traiter un multipart corps de sorte que même si vous n'avez pas consommé le flux d'entrée vous-même la Forme de l'objet serait toujours inutile.
C'était il y a longtemps - peut-être, je veux dire que si vous essayez de lire ASP Forme d'abord, puis ASPUpload n'est pas heureux? De la manière suivante: n'essayez pas de les deux sur la même demande ;-p
OriginalL'auteur Marc Gravell