Avatar billede trp79 Nybegynder
07. april 2004 - 09:30 Der er 16 kommentarer og
1 løsning

Oversættelse af VB kode til java kode med forklaring

Hejsa
Er der nogen der kan hjælpe mig med at oversætte understående vb kode til java kode og forklare mig hvad der sker?

Private Function URLEncode(ByVal URL As String) As String
Dim i As Integer
Dim sTemp As String, sChar As String
Dim sOut As String
Dim iAsc As Integer

    sTemp = Trim(URL)
    For i = 1 To Len(sTemp)
        sChar = Mid(sTemp, i, 1)
        iAsc = Asc(sChar)
        If (iAsc >= 48 And iAsc <= 57) Or (iAsc >= 97 And iAsc <= 122) Or (iAsc >= 65 And iAsc <= 90) Then
            sOut = sOut & sChar
        Else
            sOut = sOut & "%" & Hex(iAsc)
        End If
    Next i

    URLEncode = sOut
End Function


Mvh
Torben
Avatar billede arne_v Ekspert
07. april 2004 - 09:40 #1
String s2 = URLEncode.encode(s1, "ISO-8859-1");

må være Java versionen !

Ovenstående VB kode tager [0-9A-Za-z] og bruger dem uændret og konverterer
resten til %nn (hvor nn er hex).

Og det er som sagt indbygget i Java.

Hvis de skal være kan jeg godt "håndkode" det helt tilsvarende.
Avatar billede trp79 Nybegynder
07. april 2004 - 09:43 #2
Hej Arne
Tak for svaret. Nej du behøver ikke håndkode, det er bare funktionaliteten jeg skal bruge. I hvilket tilfælde vil man ofte bruge en sådan URL encode - det må næsten være i forbindelse med fx http requests for at undgå problemer med æøå eller?
Avatar billede arne_v Ekspert
07. april 2004 - 09:47 #3
URL'er med ÆØÅ o.lign. ja
Avatar billede arne_v Ekspert
07. april 2004 - 09:49 #4
Jeg lavede lige koden alligevel:

import java.net.*;

public class EU {
    public static String myurlencoder(String s) {
        char hexdigit[] = { '0', '1', '2', '3', '4', '5', '6', '7',
                            '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        StringBuffer sb = new StringBuffer("");
        for(int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if(('0' <= c && c <= '9') ||
            ('A' <= c && c <= 'Z') ||
            ('a' <= c && c <= 'z')) {
                sb.append(c);
            } else {
                sb.append('%');
                sb.append(hexdigit[(c >> 4) & 0x0F]);
                sb.append(hexdigit[c & 0x0F]);
            }
        }
        return sb.toString();   
    }
    public static void main(String[] args) throws Exception {
        System.out.println(URLEncoder.encode("Dette er ÆØÅ", "ISO-8859-1"));
        System.out.println(myurlencoder("Dette er ÆØÅ"));
    }
}
Avatar billede arne_v Ekspert
07. april 2004 - 09:49 #5
Og der er en lile forskel i output:

Dette+er+%C6%D8%C5
Dette%20er%20%c6%d8%c5

Den indbyggede laver space til + mens VB koden laver space til %20.
Avatar billede arne_v Ekspert
07. april 2004 - 09:50 #6
Og et svar
Avatar billede trp79 Nybegynder
07. april 2004 - 10:03 #7
Mange tak for hjælpen.

God påske, mvh
Torben
Avatar billede trp79 Nybegynder
07. april 2004 - 10:04 #8
Super med den sidste klasse, efter som jeg skal bruge %20 som spaces :)
Avatar billede arne_v Ekspert
07. april 2004 - 11:49 #9
Det kan også løses på ande måder. Eksempel:

        System.out.println(URLEncoder.encode("Dette er ÆØÅ", "ISO-8859-1").replaceAll("\\+", "%20"));
Avatar billede trp79 Nybegynder
07. april 2004 - 14:59 #10
Det var da lidt nemmere end med klassen! - er der stor effektivitets forskel på klassen og dit sidste eksempel?
Avatar billede arne_v Ekspert
07. april 2004 - 16:12 #11
Det vil kræve en lille test at undersøge det.
Avatar billede trp79 Nybegynder
07. april 2004 - 16:14 #12
Okay - det var bare lige hvis du viste det.

Mange tak for hjælpen.
Avatar billede arne_v Ekspert
07. april 2004 - 19:21 #13
Den hjemmelavede er meget hurtigere.
Avatar billede arne_v Ekspert
07. april 2004 - 19:21 #14
import java.net.*;

public class EUTest {
    private final static int N = 100000;
    public static String myurlencoder(String s) {
        char hexdigit[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        StringBuffer sb = new StringBuffer("");
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (('0' <= c && c <= '9') || ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z')) {
                sb.append(c);
            } else {
                sb.append('%');
                sb.append(hexdigit[(c >> 4) & 0x0F]);
                sb.append(hexdigit[c & 0x0F]);
            }
        }
        return sb.toString();
    }
    public static void main(String[] args) throws Exception {
        long t1 = System.currentTimeMillis();
        for(int i = 0; i < N; i++) {
            String s = myurlencoder("Dette er ÆØÅ");
        }
        long t2 = System.currentTimeMillis();
        System.out.println("home made : " + (t2-t1));
        long t3 = System.currentTimeMillis();
        for(int i = 0; i < N; i++) {
            String s = URLEncoder.encode("Dette er ÆØÅ", "ISO-8859-1");
        }
        long t4 = System.currentTimeMillis();
        System.out.println("builtin : " + (t4-t3));
        long t5 = System.currentTimeMillis();
        for(int i = 0; i < N; i++) {
            String s = URLEncoder.encode("Dette er ÆØÅ", "ISO-8859-1").replaceAll("\\+", "%20");
        }
        long t6 = System.currentTimeMillis();
        System.out.println("builtin with mod : " + (t6-t5));
    }
}
Avatar billede arne_v Ekspert
07. april 2004 - 19:21 #15
Output på min PC:

home made : 188
builtin : 14640
builtin with mod : 15891
Avatar billede trp79 Nybegynder
07. april 2004 - 19:26 #16
Jøsses! Det var da noget af en hastigheds forskel!
Måske Sun kunne bruge noget inspiration fra dig - det er da noget, der virker det du har lavet i forhold til.

Så er jeg da i hvert fald ikke i tvivl om, hvad jeg skal bruge.

1000 tak for hjælpen.
Avatar billede arne_v Ekspert
07. april 2004 - 19:41 #17
Det skal siges at SUN jo også skal kunne håndtere forskellige karakter sæt.
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
Kurser inden for grundlæggende programmering

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

IT-JOB

Netcompany A/S

Managing Architect

Capgemini Danmark A/S

SAP S/4HANA Finance Lead

SOS International

Cloud Native Architect

Forsikrings- og pensionsakademiet A/S

IT-teknisk profil

Forsvarsministeriets Materiel- og Indkøbsstyrelse

IT-Sikkerhedsrådgiver til Cyberdivisionen i Hvidovre