[ASP/JS] URLEncode verschillend in JS en ASP

Pagina: 1
Acties:
  • 111 views sinds 30-01-2008
  • Reageer

  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
Ik heb problemen met het versturen van unicode (UTF-8) tekens via XMLHttp. De URL-encode van javascript (escape) blijkt anders te encoden dan de URLEncode van ASP.

Als ik een E, É en een E met een balkje er boven als input heb, dan geeft javascript "E%C9%u0112" en ASP "E%C3%89%C4%92".

Met javascript stel ik een url samen voor een get request. Als ik in ASP in Request.QueryString kijk, dan staat daar inderdaad de door javascipt geëncode input: "input=E%C9%u0112". Maar als ik dan in Request.QueryString(ïnput") kijk, dan staat daar niet de É in, wel de andere twee tekens. Blijkbaar is de code %C9 ongeldig en wordt die daarom weggelaten.

In de asp wordt codepage 65001 gebruikt en in de response staat dat charset UTF-8 wordt gebruikt.

Ik zou een eigen urlencode in javascript kunnen maken die op de ASP manier encode. Of ik zou in ASP een URLDecode kunnen maken die de javascript encoding snapt. Heeft er iemand een betere oplossing?

| Toen / Nu


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 06-03 20:19

_Thanatos_

Ja, en kaal

Doel je nou op het verschil tussen JScript in ASP en VBScript in ASP, of tussen Javascript op de client en ASP op de server?

日本!🎌


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
Javascript op de client en ASP op de server.

Een testscriptje voor de duidelijkheid
ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<%@ CodePage=65001 Language="VBScript" %>
<%
   Dim input
   input = Request.QueryString("input")

   Response.AddHeader "Content-type", "text/plain; charset=utf-8"
   Response.Charset = "UTF-8"
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
   <title>Charset Test</title>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
   <script type="text/javascript">
   window.onload = function() {
      var input = document.getElementById('txtInput');
      var output = document.getElementById('txtJSEncInput');
      output.value = escape(input.value);
   }
   function get() {
      var input = document.getElementById('txtInput');
      var url = window.location.href;
      url = url.replace(/\?.*$/, '');
      window.location.href = url + '?input=' + escape(input.value);
   }
   </script>
</head>
<body>
<form action="urlencode.asp" method="get">
<dl>
   <dt>Input</dt>
   <dd><input type="text" id="txtInput" name="input" size="100" value="<%= Server.HtmlEncode(input) %>"></dd>
   <dt>JS Escaped</dt>
   <dd><input type="text" id="txtJSEncInput" size="100" readonly><br>
   <dt>ASP URL Encoded</dt>
   <dd><input type="text" id="txtASPEncInput" size="100" readonly value="<%= Server.HtmlEncode(Server.URLEncode(input)) %>"></dd>
   <dt></dt>
   <dd>
      <input type="submit" value="Get">
      <input type="button" onclick="get()" value="Get (JS)">
   </dd>
</dl>
</form>
</body>
</html>

| Toen / Nu


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Tegen dit probleem ben ik ook wel eens aangelopen. Je kunt het eventueel oplossen (niet noodzakelijk een nette manier) door in je asp pagina een serverside javascript te maken:
ASP:
1
2
3
4
5
<script runat="server" language="javascript">
function decodeWithJS( input ) {
    return unescape( input );
}
</script>

Bovenstaande functie kun je in je normale ASP aanroepen.

Maar het werkelijke probleem is dus dat javascript escape niet hetzelfde is als Server.URLEncode()

http://www.w3schools.com/jsref/jsref_escape.asp sez:
...
Note: The escape() and unescape() functions should not be used to encode or decode URIs. Use encodeURI() and decodeURI() functions instead!
...

[ Voor 35% gewijzigd door bigbeng op 23-12-2005 20:40 ]


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
encodeURI() en encodeURIComponent() kende ik nog niet. Wat een heerlijk simpele oplossing :)
Dank!

| Toen / Nu


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:24

crisp

Devver

Pixelated

SuperRembo schreef op vrijdag 23 december 2005 @ 21:05:
encodeURI() en encodeURIComponent() kende ik nog niet. Wat een heerlijk simpele oplossing :)
Dank!
Bedenk wel dat IE5.0 die methods niet kent ;)

[ Voor 3% gewijzigd door crisp op 23-12-2005 23:53 ]

Intentionally left blank


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
Dat is dan weer minder :{
String.charCodeAt() wordt ook pas ondersteund vanaf IE5.5. Net als String.replace() met een callback functie.

Misschien wordt het tijd om IE5.0 uit onze lijst met ondersteunde browsers te kieperen.

| Toen / Nu


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:24

crisp

Devver

Pixelated

SuperRembo schreef op zaterdag 24 december 2005 @ 01:45:
Dat is dan weer minder :{
String.charCodeAt() wordt ook pas ondersteund vanaf IE5.5. Net als String.replace() met een callback functie.

Misschien wordt het tijd om IE5.0 uit onze lijst met ondersteunde browsers te kieperen.
Inderdaad; een hoop array-methods kent IE5.0 ook niet, en functionaliteit van reguliere expressies (look-ahead e.d) zijn ook non-existant. Daar is vaak wel omheen te werken door dmv proto-typing dergelijke methods zelf te schrijven, maar het blijft behelpen.
Feit is echter dat IE5.0 meer gebruikt wordt dan IE5.5 aangezien 5.5 enkel als upgrade verkrijgbaar was en 5.0 standaard met o.a. windows 2000 werd meegeleverd (en sommige mensen kennen het woord 'upgrade' niet :/)
Eerlijk gezegd hou ik zelf ook steeds minder rekening met IE5.0...

Intentionally left blank


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 06-03 20:19

_Thanatos_

Ja, en kaal

Waarom gebruik je dan niet gewoon Server.URLEncode en Server.URLDecode? natuurlijk kun je bij serverside-javascript ook escape() en unescape() gebruiken, maar waarom zou je eigenlijk?

[ Voor 21% gewijzigd door _Thanatos_ op 26-12-2005 02:54 ]

日本!🎌


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:24

crisp

Devver

Pixelated

_Thanatos_ schreef op maandag 26 december 2005 @ 02:53:
[...]

Waarom gebruik je dan niet gewoon Server.URLEncode en Server.URLDecode? natuurlijk kun je bij serverside-javascript ook escape() en unescape() gebruiken, maar waarom zou je eigenlijk?
De topicstarter wil het *juist* volledig clientside doen zonder postbacks - dat is ook het idee achter Ajax ;)

Intentionally left blank


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
Tekens die als %uXXXX worden geëncode zijn eigenlijk geen probleem, die worden door ASP goed geïnterpreteerd. Alleen de tekens %80 tot en met %FF zorgen voor problemen.
Ik heb nu voor IE5 een functie gemaakt die alleen de problematische codes vervangt. Misschien niet de mooiste oplossing, maar goed genoeg voor IE5.

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
if (typeof encodeURIComponent != 'function') {
    encodeURIComponent = function(s) {
        s = escape(s);
        s = s.replace(/%([89AB][0-9A-F])/gi, '~C2~$1');
        s = s.replace(/%C([0-9A-F])/gi, '~C3~8$1');
        s = s.replace(/%D([0-9A-F])/gi, '~C3~9$1');
        s = s.replace(/%E([0-9A-F])/gi, '~C3~A$1');
        s = s.replace(/%F([0-9A-F])/gi, '~C3~B$1');
        s = s.replace(/~/g, '%');
        return s;
    }
}

| Toen / Nu

Pagina: 1