Avatar billede montago Praktikant
16. oktober 2007 - 12:32 Der er 20 kommentarer og
1 løsning

URLEncode / URLDecode

Store spejl på væggen der, hvilken Encode er point'ne værd ?
Avatar billede montago Praktikant
16. oktober 2007 - 12:32 #1
/**
*
* URL encode / decode
* http://www.webtoolkit.info/
*
**/

var Url = {

    // public method for url encoding
    encode : function (string) {
        return escape(this._utf8_encode(string));
    },

    // public method for url decoding
    decode : function (string) {
        return this._utf8_decode(unescape(string));
    },

    // private method for UTF-8 encoding
    _utf8_encode : function (string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    },

    // private method for UTF-8 decoding
    _utf8_decode : function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;

        while ( i < utftext.length ) {

            c = utftext.charCodeAt(i);

            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }

        }

        return string;
    }

}
Avatar billede softspot Forsker
16. oktober 2007 - 12:36 #2
Hvis du vil skrive om løsninger her på eksperten kan jeg da anbefale at du hopper over under artikler og skriver der... ;-)

Anyway! Kan du ikke bruge encodeURI og decodeURI i stedet?
Avatar billede montago Praktikant
16. oktober 2007 - 13:10 #3
nej... idet disse 2 funktioner tager en URL som parameter..

hvis man gerne vil POST'e et textarea i AJAX, skal man bruge den funktion jeg har posted... escape() er jo helt til grin !
Avatar billede softspot Forsker
16. oktober 2007 - 13:29 #4
OK, svært at gennemskue med den overskrift (der var ligesom lagt op til at der var tale om en URL) ;-)
Avatar billede montago Praktikant
16. oktober 2007 - 13:45 #5
Det er der jo som sådan også...

URLEncode: encoder en streng så den kan bruges som parameter i en Querystring...

encodeURI tager en fucked up Querystring og encoder den: fx "?a=ting og tong" --> "?a=ting%20og%20tong"

escape tager en håndfuld tegn og oversætter dem til at blive vist i HTML sammenhæng fx : "<br>hejsa" --> "&lt;br&gt;hejsa"
Avatar billede montago Praktikant
16. oktober 2007 - 13:48 #6
hovsa... fejl

escape oversætter en håndfuld tegn til URL params... men er ikke præcis nok, og tager ikke alle tegn med, som fx æøå

det jeg skrev med HTML passer ikke
Avatar billede barklund Nybegynder
16. oktober 2007 - 14:48 #7
Og så må vi håbe, dine tekster holder sig inden for BMP :)
Avatar billede montago Praktikant
16. oktober 2007 - 15:53 #8
hehe... du har vidst ret...

Jeg har pt problemer med æøå når jeg bruger denne her Encoder... grundet UTF-8
gad vide om der findes en ANSI-URLEncoder som man kan bruge i Javascript ?
Avatar billede barklund Nybegynder
16. oktober 2007 - 16:06 #9
Du bruger latin1 og slet ikke utf8? over det hele?
Avatar billede barklund Nybegynder
16. oktober 2007 - 16:09 #10
Men ÆØÅ holder sig nu fint inden for BMP, så det var ikke så meget det, jeg snakkede om :)
Avatar billede olebole Juniormester
16. oktober 2007 - 19:15 #11
<ole>

Du skal netop _ikke_ bruge en ANSI-baseret funktion ... og de omtalte funktioner er såmænd kun fucked up, når de bliver brugt på en fucked up måde  ;o)

escape og unescape fungerer helt efter planen, når man bruger dem med de tegnsæt (encoding), de er beregnet til. Da de er ANSI-baseret, brugtes de til iso-8859-1.

Da man er ved at gøre WWW til det internationale medie, det oprindelig var tænkt som, er vi også ved at overgå til Unicode-baserede tegnsæt - i første omgang utf-8.
Derfor er escape og unescape forlængst blevet deprecated og afløst af de fire funktioner decodeURI, decodeURIComponent, encodeURI og encodeURIComponent.

Den sidste er den, du skal bruge til at escape en variabel værdi med - og et variabel navn, hvis dette indeholder tegn der i HTTP-sammenhæng er 'ulovlige'.

encodeURI bruges, dersom en hel URL skal encodes - f.eks, hvis den medsendes som værdi i en query-streng.

/mvh
</bole>
Avatar billede olebole Juniormester
16. oktober 2007 - 19:18 #12
- og hvis du har problemer med escape og/eller unescape, kan det kun skyldes, du bruger utf-8 i et eller flere led af kæden  :)
Avatar billede montago Praktikant
17. oktober 2007 - 09:01 #13
Hej Ole...

du har ret -- jeg fant fejl ved at bruge min Encoder/Decoder herover - nemlig at dokumentet blev gemt fint nok som UTF-8 hvilket ikke er så godt når de indeholder æøå - et skift til EncodeURIComponent() var derfor løsningen på æøå problemematikken.

Generelt synes jeg det er svært at overskue hvad Charset der bliver brugt hvor :(
Avatar billede softspot Forsker
17. oktober 2007 - 12:25 #14
OK, så den første indskydelse var altså ikke helt ved siden af ;-)
Avatar billede olebole Juniormester
17. oktober 2007 - 14:34 #15
Unicode (utf-8) er netop som skabt til æ, ø og å. Hele fidusen ved den encoding er, at den kan håndtere forskellige sprogs specialtegn - og dermed gør det lettere at 'tale sammen', internationalt. Tegnsættet iso-8859-1 kan også håndtere æ, ø og å - men til gengæld er der ikke ret mange andre i verden, der bruger det mere  ;o)

Hvis man bruger enten iso-8859-1 eller utf-8 og har problemer med æ, ø og å, skyldes det næsten 100% sikkert, at der ét eller andet sted i kæden findes et led, der anvender et andet tegnsæt/encoding. At fremtiden tilhører utf-8, er der næppe tvivl om ... også selvom man ikke får det indtryk ved at læse min 'Karma'  :)
Avatar billede barklund Nybegynder
17. oktober 2007 - 14:50 #16
Fremtiden tilhører unicode, uden tvivl - men ikke nødvendigvis utf-8, som har (for) meget spild, når vi kommer ud over BMP :)
Avatar billede olebole Juniormester
17. oktober 2007 - 16:28 #17
Du har ret, barklund. Fremtiden bør jeg overlade til Sibylla Flyvehanz Delphinnidatter fra Krystalkælderen i Solrød. Hun har langt større indsigt ... og så var hendes mor i øvrigt nummerolog!  ;D

Du har ganske ret! Den nærmeste fremtid, tør jeg dog godt spå, kommer til at tilhøre utf-8. Der er klart bedre måder at implementere unicode på, men vanen tro vil udviklingen nok ske i små skridt  :)
Avatar billede barklund Nybegynder
17. oktober 2007 - 20:25 #18
Ponycode for the win... eller er det puny... jeg kan aldrig huske det :(
Avatar billede olebole Juniormester
17. oktober 2007 - 20:32 #19
- punycode  ;o)
Avatar billede barklund Nybegynder
17. oktober 2007 - 20:56 #20
/me forsøger at samle olebole op på ironi-vognen...
Avatar billede olebole Juniormester
17. oktober 2007 - 21:06 #21
- damn! ... i vand til knæene!  ;D
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester