Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[ASP.NET 2.0] Request.querystring verwijdert karakterset?

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

  • Arethusa
  • Registratie: December 2003
  • Laatst online: 28-11 16:03

Arethusa

Niet die server

Topicstarter
Ik loop al een poosje tegen het volgende probleem aan. Binnen onze applicatie gaan we de russische taal ondersteunen. Dat werkt allemaal prima totdat we dmv ajax data ophalen om velden in het russich te vullen. Allereerst wat javascript:

JavaScript:
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
<script type="text/javascript">

    function CallbackRawmaterial(url, rawmatcode)
    {
        var pageUrl = url + "?callback=true&subject=rawmaterial&param=" + rawmatcode;
        alert(pageUrl)
        var xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
        xmlRequest.open("POST", pageUrl, false);
        xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xmlRequest.send(null);
        return xmlRequest;
    }   
    
    function getRawMaterialName()
    {
    
        var selectedRawMaterialID = document.all["txtRawMaterialcode"].value;
        var xmlRawMaterialNameRequest = CallbackRawmaterial("AddSimpleIntake.aspx", selectedRawMaterialID);
        document.getElementById('txtRawMaterialname').value = xmlRawMaterialNameRequest.responseText;
        document.getElementById('ddlIntakeposition').focus();
        var myResponse = xmlRawMaterialNameRequest.responseText;          
        if (myResponse.length < 1)
        {
            window.showModalDialog ('../ModalMessage.aspx?ErrorFrom=ADDDSIGNIN', null, 'status:no;dialogWidth:360px;dialogHeight:145px;dialogHide:true;help:no;scroll:no');
        }
        return false;       
    }
</script>


Kortgezegd haalt deze code waarde uit velden en stopt ze in een string die ik met de volgende code ophaal:
Visual Basic .NET:
1
2
3
4
5
6
'toevoegen eigenschappen aan tekstboxen
            txtRawMaterialcode.Attributes.Add("OnTextChanged", "getRawMaterialName()")
            txtRawMaterialcode.Attributes.Add("onblur", "getRawMaterialName()")

            txtRawMaterialname.Attributes.Add("OnTextChanged", "getRawMatCodeName()")
            txtRawMaterialname.Attributes.Add("onblur", "getRawMatCodeName()")


Ophalen deel van string en opslaan in variable:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Shadows Function IsCallback() As Boolean
            If Not Request.QueryString("callback") Is Nothing Then
                If Request.QueryString("subject") = "rawmaterial" Then
                    Dim strRawmatCode As String = Request.QueryString("param").ToString()
                    Response.Write(CallbackEventRawMaterial(strRawmatCode))
                    Response.Flush()
                    Response.End()
                    Return True
                ElseIf Request.QueryString("subject") = "rawmatcodename" Then
                    Dim strRawmatCodeName As String = Request.QueryString("param").ToString()
                    Response.Write(CallbackEventRawMatName(strRawmatCodeName))
                    Response.Flush()
                    Response.End()
                    Return True
                End If
            End If
            Return False
        End Function


De CallbackEventRawMaterial en de CallbackEventRawMatName zijn functies die de juiste gevens uit de database halen en niet van belang voor mijn probleem.


Het probleem is dat wanneer ik via:
Visual Basic .NET:
1
Dim strRawmatCodeName As String = Request.QueryString("param").ToString() 
mijn request uitlees ik een waarde in strRawmatCodeName die gelijk is als 00000?????. Die vraagteksten moeten russische tekst bevatten.

De javascript functie CallbackRawMaterial geeft met alert(pageUrl) o.m de variable param (zie code voorbeeld) en wel de juiste russische tekst.

Afbeeldingslocatie: http://aycu25.webshots.com/image/34544/2005839993305825511_rs.jpg

Nu heb ik het een en andere gelezen over karaktercodering en encoding en decoding. In vb.net heb je ook die opties maar na een aantal combinaties met fileencoding en htmlencode etc merk ik geen verschil. Ik heb begrepen dat ajax als karakterset UTF-8 is wat betekend dat mijn tekst word afgebeeld. Het javascript gedeelte beaamt dit ook. Ook de .aspx en de .aspx.vb pagina's zelf zijn in utf-8 opgeslagen.

In mijn web.config file staat het volgende:
XML:
1
2
3
4
5
        <globalization culture="nl-NL" uiCulture="nl-NL"
            requestEncoding="utf-8"
            responseEncoding="utf-8"
            fileEncoding= "utf-8"
            responseHeaderEncoding="utf-8" />



Misschien klinkt dit verhaal wat warrig en is de post wat lang maar wat ik eigenlijk wil vragen is hoe ik er voor kan zorgen dat ik op de juiste manier de string "param" in het russisch krijg want ik kan niets meer verzinnen. Het ajax gedeelte beeld de string goed af maar mijn vb.net gedeelte niet. Ik zit nu op mijn werk en kan pas morgenvroeg een aantal dingen hier uit proberen maar heeft iemand een idee?

I've been mad for fucking years, absolutely years, been over the edge for yonks.
Vinyl: Discogs


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 27-11 10:50

_Thanatos_

Ja, en kaal

Allereerst, gebruik geen document.all, dat werkt niet overal gegarandeerd.

Ten tweede, Ik gok zo aan je code te zien dat het mis gaat bij het AJAX-request. Ik denk dat die niet ervan op de hoogte is dat er met UTF-8 gewerkt wordt, want dat stel je niet in. Ik weet niet wat de default is, maar ik kan me voorstellen dat de defaultencoding van XMLHTTPRequest de encoding van de huidige user locale is, en voor een nederlandse locale is dat iso-8859-15 of latin-9. En dus niet utf-8.

Het is een long shot, maar misschien duw ik je in de juiste richting ;)

日本!🎌


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
_Thanatos_ schreef op woensdag 28 november 2007 @ 01:27:
Allereerst, gebruik geen document.all, dat werkt niet overal gegarandeerd.
Ik zie wel meer IE-only code (showModalDialog, new ActiveXObject); ik neem aan dat dit intranet spul is ofzo en voor IE-specifiek gebouwd.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Arethusa
  • Registratie: December 2003
  • Laatst online: 28-11 16:03

Arethusa

Niet die server

Topicstarter
@ _Thanatos_ , ik zal eens kijken of ik kan achterhalen wat er precies aan defaultencoding word meegestuurd. Ik ging er klakkeloos van uit dat het utf-8 was, wellicht kan ik die aanname niet zo maar nemen.


@RobIII, dit is inderdaad een ie only (voorlopig) applicatie. Deze draait bij klanten op een intranet. Het werkend krijgen op andere browsers dan IE is op dit moment geen vereiste.


Mochten er nog meer tips zijn om mijn probleem te tackelen dan hoor ik deze graag.

I've been mad for fucking years, absolutely years, been over the edge for yonks.
Vinyl: Discogs


  • Arethusa
  • Registratie: December 2003
  • Laatst online: 28-11 16:03

Arethusa

Niet die server

Topicstarter
Heb nu charset=UTF-8 aan mijn xmlRequest toegevoegd:
JavaScript:
1
xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");


en hieronder volgt een aanpassing aan mijn web.config:
XML:
1
2
3
4
5
6
<globalization culture="ru-RU"
uiCulture="ru-RU"
requestEncoding="utf-8"
responseEncoding="utf-8"
fileEncoding= "utf-8"
responseHeaderEncoding="utf-8" />


Beide halen vooralsnog niets uit.

In mijn vb.net code kan ik dmv het ophalen van mijn request in een streamreader ook zien dat utf-8 wordt meegestuurd. Toch blijf ik de vraagtekens in mijn string houden.

I've been mad for fucking years, absolutely years, been over the edge for yonks.
Vinyl: Discogs


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 27-11 10:50

_Thanatos_

Ja, en kaal

Het werkend krijgen op andere browsers dan IE is op dit moment geen vereiste.
Beetje non-argument om het dan maar niet op de algemeen aangenomen goede manier te doen. Het is tenslotte ook geen vereiste dat ik je probeer te helpen ;)

Nu kost het extra tijd om het cross-browser te maken, maar bij het volgende project bespaart het tijd hè ;)

日本!🎌


  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 20-11 21:40

Not Pingu

Dumbass ex machina

Hier wordt aangeraden om clientside je tekst te URIEncoden en daarna serverside te decoden (in dit geval met Server.UrlDecode()).

Certified smart block developer op de agile darkchain stack. PM voor info.


  • Arethusa
  • Registratie: December 2003
  • Laatst online: 28-11 16:03

Arethusa

Niet die server

Topicstarter
@_Thanatos_, begrijp me niet verkeerd ik waardeer je hulp. Maar wij leveren 1 product die we modulair uitbouwen en werken voor een relatief compacte markt. Ik weet dat de kans bestaat dat we wellicht ooit eens een andere browser moeten gaan supporten maar dat komt ter zijner tijd wel.

Ik zal in ieder geval de tips die her en der genoemd worden toepassen waar nodig.


@Not Pingu, bedankt voor je tip. Ik zal hier morgen zeker naar kijken het ziet er in ieder geval veel belovend uit.

[ Voor 4% gewijzigd door Arethusa op 28-11-2007 20:39 ]

I've been mad for fucking years, absolutely years, been over the edge for yonks.
Vinyl: Discogs


  • Arethusa
  • Registratie: December 2003
  • Laatst online: 28-11 16:03

Arethusa

Niet die server

Topicstarter
Met behulp van de tip van Not Pingu met de term "encodeURIComponent" heb ik het geheel werkend kunnen krijgen.

Ik heb mijn javascript
JavaScript:
1
var selectedRawMaterialID = document.all["txtRawMaterialcode"].value;

vervangen door

JavaScript:
1
 [var selectedRawMatCodeName = encodeURIComponent(document.getElementById("txtRawMaterialcode").value);


En mijn VB.NET code:
Visual Basic .NET:
1
Dim strRawmatCode As String = Request.QueryString("param").ToString()


vervangen door:

Visual Basic .NET:
1
Dim strRawmatCode As String = Server.UrlDecode(Request.QueryString("param")).ToString()


Op deze manier krijg ik de juiste waarden terug en worden de velden in mijn scherm goed afgebeeld. En ik geloof dat ik document.all ook op de juiste wijze heb vervangen correct me if i'm wrong

Bedankt voor het meedenken!

I've been mad for fucking years, absolutely years, been over the edge for yonks.
Vinyl: Discogs

Pagina: 1