Avatar billede kernelx Juniormester
04. februar 2009 - 10:47 Der er 4 kommentarer og
1 løsning

RegExp replaceAll med tegn unicode større end 127

Hi,

jeg har en String som indeholder tegn som har en unicode-værdi større end 127.
Nu skal alle disse tegn replaces med
\Uxxxx

xxxx er fire hex-værdier, som er unicode-tegnet.

eksempel
Ø = Unicode 216 - skal laves om til:
Ø -> \U00D8

er det muligt at lave det med en replace?
String testString = "åbla blæa blÆØÅa";
String newString = testString.replaceAll( "???", "???" );

eller findes der en anden god methode at lave det på?


med venlig hilsen
KernelX
Avatar billede arne_v Ekspert
04. februar 2009 - 19:14 #1
Jeg havde den her paa lageret:

    public static String encode(String s) {
        StringBuffer sb = new StringBuffer("");
        for(int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if((c >= 0) && (c <=255)) {
                sb.append(c);
            } else {
                String hex = Integer.toHexString(c);
                sb.append("\\u" + "0000".substring(hex.length(), 4) + hex);
            }
        }
        return sb.toString();
    }

Det er ikke regex, men jeg tror at den loeser dit problem (hvis du retter 255 til 127).
Avatar billede arne_v Ekspert
04. februar 2009 - 19:14 #2
Og u til U hvis det er vigtigt
Avatar billede kernelx Juniormester
04. februar 2009 - 19:35 #3
Jeg har lavet det på samme måde.
Det eneste som jeg har lavet anderledes var, at jeg har brugt String i stedet for StringBuffer.

Når det har været store mængder af data, som skulle "encode"'s, så har java-applicationen brugt alt for lang tid.

Så mit udgangspunkt-problem har været, at java-programmet bruger alt for meget tid på min version.
jeg vil checke det med StringBuffer i morgen.

mange tak!
Avatar billede kernelx Juniormester
04. februar 2009 - 19:36 #4
husk at skrive et eller andet som svar :-)
Avatar billede arne_v Ekspert
04. februar 2009 - 19:54 #5
StringBuffer (eller StringBuilder hvis Java version >= 1.5 !!!!) vil vaere meget hurtigere end String hvis det er en lang streng du processer.

Saadan groft sagt har StringBuffer/StringBuilder O(n) egenskaber mens String har O(n*n) egenskaber, hvor n er antal gennemloeb af loekken.

Det betyder ikke en snus hvis n er 10 eller 20. Men hvis n er mange tusinder, saa goer det avs.

Jeg tror ikke at der findes en replaceAll loesning, da man ikke kan bruge $g som argument til en anden metode.

Og et svar.
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