Avatar billede kasseper Nybegynder
27. marts 2002 - 12:02 Der er 11 kommentarer og
2 løsninger

Fra ascii til tekst...

Hej

Jeg har en lille opgave jeg gerne vil ha løst....

Jeg har i en browser submittet en form til min accessbean. Den form indeholder et input type text field, som ligger i en streng når alle property's er sat.
Jeg har inden jeg submittet formen lavet escape på strengen da den meget vel kan indeholde special tegn. Derfor er alle special tegn lavet om til % + ascii værdi.

Strengen hedder myString.
Det der er opgaven er at lave en function der tager en streng og oversætter alle disse forekomster af escapede karaktere til klar tekst. Og returnere den læselige streng.

Er spørgsmålet forstået ? Godt sæt i gang !!!!!
Avatar billede jakoba Nybegynder
27. marts 2002 - 12:39 #1
int hexVerdi ( char forste, char anden ) { // hjælpefunktion  hexværdi eller -1
    static final String cifre = "01234567890ABCDEF";
    int c1 = cifre.indexOf( toUpperCase(forste) );
    int c2 = cifre.indexOf( toUpperCase(anden) );
    if ( ( c1 * c2 ) < 0 ) {
        return -1;
    } else {
        return c1*16 +c2;
    }
} //end hexVerdi()

String unescape( String myString ) {
    StringBuffer resultat = new StringBuffer();
    int sIdx = 0;
    int sMax = myString.length():
    while ( sIdx < sMax ) {
        while ( sIdx < sMax && myString.charAt(sIdx) != '%' ) {
            resultat.append( myString.charAt(sIdx++) );
        }
        if ( myString.charAt(sIdx) == '%' ) {
            int charKode = -1;
            if ( sIdx <= sMax-3 ) {
                int charKode = hexVerdi ( myString.charAt(sIdx+1), myString.charAt(sIdx+2) );
            }
            if ( charKode >= 0 ) {
                resultat.append( (char)charKode );
                sIdx += 3;
            } else {
                resultat.append( myString.charAt(sIdx++) );
            }
        }
    }
    return resultat.toString();
} //end unescape().

mvh JakobA
Avatar billede kasseper Nybegynder
27. marts 2002 - 12:42 #2
Afprøver lige....Kan du så ikke i mellem tiden lægge et svar i
http://www.eksperten.dk/spm/190179 :)
Avatar billede jakoba Nybegynder
27. marts 2002 - 12:48 #3
Ups. testen
    if ( ( c1 * c2 ) < 0 ) {
duer ikke. det skal være:
    if ( c1 < 0 || c2 < 0 ) {

sorry
Avatar billede kasseper Nybegynder
27. marts 2002 - 13:06 #4
Det virker ikke helt :

Jeg har rettet de små bugs der var i koden, den ville ikke compile....
Så nu ser den sådan ud :

public static int hexVerdi ( char forste, char anden ) { // hjælpefunktion  hexværdi eller -1
        String cifre = "01234567890ABCDEF";
        int c1 = cifre.indexOf( Character.toUpperCase(forste) );
        int c2 = cifre.indexOf( Character.toUpperCase(anden) );
      if ( c1 < 0 || c2 < 0 ) {
            return -1;
        } else {
            return c1*16 +c2;
        }
    } //end hexVerdi()

    private static String unescape( String myString ) {
        StringBuffer resultat = new StringBuffer();
        int sIdx = 0;
        int sMax = myString.length();
        while ( sIdx < sMax ) {
            while ( sIdx < sMax && myString.charAt(sIdx) != '%' ) {
                resultat.append( myString.charAt(sIdx++) );
            }
            if ( myString.charAt(sIdx) == '%' ) {
                int charKode = -1;
                if ( sIdx <= sMax-3 ) {
                    charKode = hexVerdi ( myString.charAt(sIdx+1), myString.charAt(sIdx+2) );
                }
                if ( charKode >= 0 ) {
                    resultat.append( (char)charKode );
                    sIdx += 3;
                } else {
                    resultat.append( myString.charAt(sIdx++) );
                }
            }
        }
        return resultat.toString();
    } //end unescape().

   


Jeg har så submittet denne streng :

TEST : |;¤§  - %%&/''*^¨~

Når den der escapet ser den sådan her ud :

TEST%20%3A%20%7C%3B%A4%A7%20%20-%20%25%25%26/%27%27*%5E%A8%7E

Og når den er kørt igennem unescape ser den sådan her ud :

TEST ; }<´·  - %%&/''*_¸


Så der er noget galt...!
Avatar billede jakoba Nybegynder
27. marts 2002 - 13:14 #5
Adv. det ligner noget med valg af alfabet (US-ascii versus isoLatin og sådan noget). Det ved jeg for lidt om.
Avatar billede kasseper Nybegynder
27. marts 2002 - 13:17 #6
Men det er humlen i det hele, da jeg skal kunne håndtere specialtegn.
Avatar billede jakoba Nybegynder
27. marts 2002 - 14:33 #7
just.
men der er nu også moget der ikke passer.
: (%3A) bliver til ; (%3B)
| (%7C) bliver til } (%7D)
; (%3B) bliver til < (%3C)

det ligner jo ligesom en tanke, somom det nok snarere er en logisk fejl i min kode. men jeg kan skutte finde den.

mvh JakobA

Gaaah. tid til en homer.
        String cifre = "01234567890ABCDEF";
skal da naturligvis være
        String cifre = "0123456789ABCDEF";

Jeg havde sat et 0 ind efter 9. man forbløffes!
Avatar billede online-help.dk Nybegynder
29. marts 2002 - 21:19 #8
kan jeg få det script der virker??
Avatar billede jakoba Nybegynder
29. marts 2002 - 21:33 #9
class Encoder {
 
    private String cifre = "0123456789ABCDEF";
 
    private String normalchr =
      "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ/:-?#=";

    private int hexVerdi ( char forste, char anden ) { // hjælpefunktion  hexværdi eller -1
        int c1 = cifre.indexOf( Character.toUpperCase(forste) );
        int c2 = cifre.indexOf( Character.toUpperCase(anden) );
      if ( c1 < 0 || c2 < 0 ) {
            return -1;
        } else {
            return c1*16 +c2;
        }
    } //end hexVerdi()

    public String unescape( String myString ) {
        StringBuffer resultat = new StringBuffer();
        int sIdx = 0;
        int sMax = myString.length();
        while ( sIdx < sMax ) {
            if ( sIdx < sMax && myString.charAt(sIdx) != '%' ) {
                resultat.append( myString.charAt(sIdx++) );
            } else
            if ( myString.charAt(sIdx) == '%' ) {
                int charKode = -1;
                if ( sIdx <= sMax-3 ) {
                    charKode = hexVerdi ( myString.charAt(sIdx+1), myString.charAt(sIdx+2) );
                }
                if ( charKode >= 0 ) {
                    resultat.append( (char)charKode );
                    sIdx += 3;
                } else {
                    resultat.append( myString.charAt(sIdx++) );
                }
            }
        }
        return resultat.toString();
    } //end unescape()

    public String escape( String sourceStr ) {
      StringBuffer resultat = new StringBuffer();
      int sIdx = 0;
      int sMax = sourceStr.length();
      while ( sIdx < sMax ) {
          if ( normalchr.indexOf( sourceStr.charAt(sIdx) ) >= 0 ) {
              resultat.append( sourceStr.charAt(sIdx++) );
          } else {
            if ( (int)sourceStr.charAt(sIdx) == 0 ) {
                System.out.println( " ? ? ? ? ?" );
            } else {
                resultat.append( '%' );
                resultat.append( cifre.charAt( (int)((byte)sourceStr.charAt(sIdx)/16) ) );
                resultat.append( cifre.charAt( (int)((byte)sourceStr.charAt(sIdx++)%16) ) );
            }
          }
      }
      return resultat.toString();     
    } //end escape

} //endclass Encoder


class URLtest {
 
  static String syslinie() {
      int i;
      StringBuffer res = new StringBuffer();
      System.out.print( "> " );
      try {
          while ( (i=System.in.read()) != 13 )
              if ( i != 0 && i != 10 ) res.append( (char) i );
      } catch (Exception e) { };
      return res.toString();
  }; //end syslinie

public static void main(String[] args) {

    Encoder e = new Encoder();
    String kodet;
    String outpu;
    String inpu = syslinie();
    while ( inpu.length() > 0 ) {
        System.out.println( "ind:  "+inpu );
        kodet = e.escape( inpu );
        System.out.println( "kode:"+kodet );
        outpu = e.unescape( kodet );
        System.out.println( "ud:  "+outpu );
        inpu = syslinie();
    }

}; //end main

} //endclass URLtest

// TEST : |;¤§  - %%&/''*^¨~

mvh JakobA
Avatar billede jakoba Nybegynder
29. marts 2002 - 21:36 #10
online-help.dk >> mit valg af bogstaver til strengen normalchr er mere gæt end viden. check selv med http-specs.
Avatar billede kasseper Nybegynder
30. marts 2002 - 12:20 #11
OK, ok ok ok ok ok ok ok. Jeg har ikke afprøvet dit script jakoba...
Jeg må med sorg fortælle at jeg netop har blotlagt vores manglende viden om java.net API'et... Der findes en java.net.Decoder, der gør præcis det som jeg skal bruge. Så den tror jeg bare at jeg bruger.... ANYWAY, så skal du da ha dine point for at finde en løsning.....!svar
Avatar billede jakoba Nybegynder
30. marts 2002 - 15:10 #12
Jamen det er da rart at høre du også kan kan lave fejl ( omend knapt så fjogede :-))

Skal vi dele i porten? 50/50

mvh JakobA
Avatar billede kasseper Nybegynder
04. maj 2002 - 11:15 #13
OK, sorry the Looooooooongggg turnaround time...:)
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