# Base64 - Wie beziehe ich die Umlaute in die Speicherplatzrechnung mit ein?



## Stoegizzle (11. Dez 2017)

Hallo Gemeinschaft  
Ich habe folgendes Problem: Ich muss für eine universitäre Arbeit ein Base64 Programm schreiben dass einen Text kodiert bzw dekodiert. Nun stoße ich bereits am Anfang auf ein Problem: bei der Speicherplatzberechnung weiss ich nicht genau wie ich den string darauf untersuchen kann wie viele Umlaute bzw"ß" er enthält -.-
Bitte um Hilfe stehe mega am Schlauch.


----------



## truesoul (11. Dez 2017)

Hallo.

Wenn du Umlaute insgesamt zählen willst, dann erstelle eine Methode, die dir die Summe zurück gibt.
In der Methode gehst du via Schleife über jeden char eines char Array's (toCharArray()) rüber und prüfst ob es ein Umlaut ist, wenn ja setzt du den Zähler einen hoch. 

toCharArray() ist die Methode die dafür gebrauchen könntest. 

Grüße


----------



## Stoegizzle (11. Dez 2017)

@truesoul das funktioniert aber bei mir nicht so richtig
gibt bei mir fehler aus, da inkompartibilität zwischen char und java.lang.string



```
public static int getBase64ByteSize(String str) {
    /* Speicherplatz für den eingegebenen Text berechnen
     *und gegebenenfalls noch Nullen anhängen, um die Kodierung
     *bzw Dekodierung möglich zu machen */
  
  
    //Wir beachten die Ausnahmen bei Umlauten un "ß"
    //String str;
    char[] array= str.toCharArray();
  
     for(int i = 0; i <= array.length; i++) {
      if(array[i] == "\u00C4") {
        z++;
      } else if(array[i] == "\u00E4") {
        z++;
      } else if(array[i] == "\u00D6") {
        z++;
      } else if(array[i] == "\u00F6") {
        z++;
      } else if(array[i] == "\u00DC") {
        z++;
      } else if(array[i] == "\u00FC") {
        z++;
      } else if(array[i] == "\u00DF") {
        z++; 
      }
    }
```


----------



## truesoul (11. Dez 2017)

Also du musst schon sagen welche Position im Array der Prüfen soll.
Also sowas wie:


```
array[i] == 'ß'
```
_
z.B_


----------



## Stoegizzle (11. Dez 2017)

das habe ich hinter alllen array stehen hats nur nicht hier ins forum mit reinkopiert 
aber selbst so funktioniert das nicht ,da ich anscheinend nicht auf den string den die methode bekommt ein char array bilden kann oder weis gott warum -.-


----------



## mrBrown (11. Dez 2017)

truesoul hat gesagt.:


> Also du musst schon sagen welche Position im Array der Prüfen soll.
> Also sowas wie:
> 
> 
> ...


Das [i] wurd da wieder vom Forum zerschossen


----------



## mrBrown (11. Dez 2017)

Stoegizzle hat gesagt.:


> aber selbst so funktioniert das nicht ,da ich anscheinend nicht auf den string den die methode bekommt ein char array bilden kann oder weis gott warum -.-


Warum vergleichst du denn den char im Array nicht mit dem char den du suchst, also z.B. 'ß'? 


Wofür müsst ihr da überhaupt Umlaute gesondert behandeln?


----------



## Stoegizzle (11. Dez 2017)

@mrBrown wie meinst du das geanu könntest du da ein beispiel bringen?
Wir dürfen nicht die java eigenen methoden benutzen und müssen das alles selbst schreiben und eine Metode davon ist eben diese hier zur berechnung der anzahl der bytes und da umlaute 2 bytes benötigen bringen die ansonsten die formel durcheinander


----------



## mrBrown (11. Dez 2017)

Stoegizzle hat gesagt.:


> @mrBrown wie meinst du das geanu könntest du da ein beispiel bringen?


Statt `[I]"\u00DF"[/I]` einfach `'ß'`



Stoegizzle hat gesagt.:


> Wir dürfen nicht die java eigenen methoden benutzen und müssen das alles selbst schreiben und eine Metode davon ist eben diese hier zur berechnung der anzahl der bytes und da umlaute 2 bytes benötigen bringen die ansonsten die formel durcheinander


Jeder char in Java ist 2 Byte groß, die sind UTF-16...


----------



## truesoul (11. Dez 2017)

mrBrown hat gesagt.:


> Das [i] wurd da wieder vom Forum zerschossen



Ach ja, stimmt. Da war ja was mit dem Forum und dem i


----------



## Stoegizzle (11. Dez 2017)

wir müssen allerdings UTF-8 verwenden und in unserem code dürfen alle umlaute etc nur als unicode stehen wir dürfen also nicht einfach Ä Ö ß schreiben was die ganze sache echt ungemütlich macht


----------



## truesoul (11. Dez 2017)

Also darf der Code auch Unicode erhalten für die Umlaute?


----------



## Stoegizzle (11. Dez 2017)

das steht nirgendwo explizit geschrieben. auf dem aufgabenblatt steht nur dass dies dazu dient um auch auf anderen geräten den code vollständig korrekt lesen und compilieren zu koennen


----------



## mrBrown (11. Dez 2017)

Stoegizzle hat gesagt.:


> wir müssen allerdings UTF-8 verwenden und in unserem code dürfen alle umlaute etc nur als unicode stehen wir dürfen also nicht einfach Ä Ö ß schreiben was die ganze sache echt ungemütlich macht


Dann rechne den String doch erst in UTF-8 um (vermutlich zu einem byte-Array, oder wie sieht die Vorgabe aus?), und zähl dann dessen Länge.
Sonderzeichen zählen ist zumindest ein ziemlich unsinniger Weg (sind ja nur ein paar tausend...)

Wenn das doch so gemacht werden soll, ist dein Code von oben richtig - du musst nur die Strings zu chars ändern (dafür reichts, die Anführungszeichen anzupassen) 


(Und 'ß' ist Unicode...unabhängig davon, ob man 'ß' oder '\u00DF' schreibt. Wer stellt denn solche Aufgaben )


----------



## truesoul (11. Dez 2017)

Bitte Ignorieren


----------



## mrBrown (11. Dez 2017)

truesoul hat gesagt.:


> Falsche Info


Wen bzw was meinst du?


----------



## truesoul (11. Dez 2017)

mrBrown hat gesagt.:


> Wen bzw was meinst du?



Mich  Hätte vielleicht "Bitte Ignorieren" schreiben sollen


----------



## Stoegizzle (11. Dez 2017)

Ja die umwandlung in ein utf-8 habe ich eig so:
byte[] bytes = str.getBytes( "UTF-8" );
allerdings malwieder fahlercode .... versteh so langsam garnichts mehr


----------



## mrBrown (11. Dez 2017)

Stoegizzle hat gesagt.:


> allerdings malwieder fahlercode .... versteh so langsam garnichts mehr


Und was für einen Fehler...?




truesoul hat gesagt.:


> Mich  Hätte vielleicht "Bitte Ignorieren" schreiben sollen


Ah, war verwirrt weil da noch kein "bearbeitet" bei stand


----------



## Stoegizzle (11. Dez 2017)

@mrBrown
 Error: Unhandled exception type java.io.UnsupportedEncodingException


----------



## truesoul (11. Dez 2017)

Hi


```
private final Charset UTF8_CHARSET = Charset.forName("UTF-8");

String decodeUTF8(byte[] bytes) {
    return new String(bytes, UTF8_CHARSET);
}

byte[] encodeUTF8(String string) {
    return string.getBytes(UTF8_CHARSET);
}
```

Grüße


----------



## Stoegizzle (11. Dez 2017)

@truesoul
das einfach mit in die methode rein und dann gehts oder wie?


----------



## truesoul (11. Dez 2017)

Also Java verwendet Standardmäßig UTF-16 für String oder StringBuilder und du wolltest ein UTF-16 "encoden" in UTF-8.

Also da musst du den String schon vorher in das richtige Format bringen.

Grüße


----------



## Stoegizzle (11. Dez 2017)

was wenn ichs in notepad++ als utf8 abspeicher reicht das dann acuh schon?


----------



## truesoul (11. Dez 2017)

Stoegizzle hat gesagt.:


> was wenn ichs in notepad++ als utf8 abspeicher reicht das dann acuh schon?



Versuche es doch


----------



## mrBrown (11. Dez 2017)

Stoegizzle hat gesagt.:


> Error: Unhandled exception type java.io.UnsupportedEncodingException


Mit obigem Code?

Welches Betriebssystem, welche Java-Version?


----------



## Stoegizzle (11. Dez 2017)

java runtime environment 8
windows 10
jap mit obigen code


----------



## Stoegizzle (11. Dez 2017)

nein geht nicht


----------



## mrBrown (11. Dez 2017)

truesoul hat gesagt.:


> Also Java verwendet Standardmäßig UTF-16 für String oder StringBuilder und du wolltest ein UTF-16 "encoden" in UTF-8.
> 
> Also da musst du den String schon vorher in das richtige Format bringen.


Intern ist das immer UTF-16 (bis Java 8, ab 9 mit etwas Trickserei), wenn `getBytes("UTF-8")` einen Fehler wirft, ist irgendwas gewaltig falsch...


----------



## Stoegizzle (11. Dez 2017)

und was kann ich da dagegen machen? -.-


----------



## mrBrown (11. Dez 2017)

Stoegizzle hat gesagt.:


> java runtime environment 8


Und was ist die genaue Version?

Wie kompilierst und startest du es?

(Und am besten noch die gesamte Fehlermeldung)


----------



## Stoegizzle (11. Dez 2017)

wir müssen mit drjava arbeiten ganaueras als jre 1.8 kann ich etz auch ned sagen 

koennte ich auch den code von @Soul irgendwo einfuegen und wenn ja wo?


----------



## mrBrown (11. Dez 2017)

Stoegizzle hat gesagt.:


> koennte ich auch den code von @Soul irgendwo einfuegen und wenn ja wo?


Das wird nichts ändern, dein fehlerwerfender Code läuft auf das gleiche hinaus, dürfte also den gleichen Fehler werfen.



Stoegizzle hat gesagt.:


> wir müssen mit drjava arbeiten ganaueras als jre 1.8 kann ich etz auch ned sagen


Dann wende dich an den Prof/Tutor/Whatever. Wenn UTF-8 ein unbekanntes Charset ist, ist irgendwas mit der JVM nicht in Ordnung, vielleicht ist das auch gewollt von drjava. (aber ernsthaft, drjava an 'ner Uni?)


----------



## Xyz1 (11. Dez 2017)

Lass dich von dem Quatsch von den beiden nicht ablenken....

```
class Speicherplatz {
    public static void main(String[] args) throws IOException {
        String s = "Hällü"; // Die Ümlaute bräuchen in UTF 8 2 Bytes.
        final int length1 = length(s);
        write(s);
        final int length2 = (int) new File("54321.txt").length();
        System.out.println(length1);
        System.out.println(length2);
        System.out.println(length1 == length2);
    }
    private static byte[] encode(String s) throws UnsupportedEncodingException {
        return s.getBytes("UTF-8");
    }
    private static int length(String s) throws UnsupportedEncodingException {
        return encode(s).length;
    }
    private static void write(String s) throws IOException {
        try (FileWriter fw = new FileWriter("54321.txt")) {
            fw.write(s);
        }
    }
}
```

Ich zitiere mal:


> Convenience class for writing character files. The constructors of this class assume that the default character encoding and the default byte-buffer size are acceptable. To specify these values yourself, construct an OutputStreamWriter on a FileOutputStream.


----------



## mrBrown (11. Dez 2017)

DerWissende hat gesagt.:


> Lass dich von dem Quatsch von den beiden nicht ablenken....


Dir ist schon aufgefallen, dass UTF-8 eine UnsupportedEncodingException wirft?

Ansonsten: Glückwunsch, dass du die Länge erfolgreich bestimmt hast, du kannst sehr stolz auf dich sein.
Das Zitat ist aber völlig überflüssig und hat nichts hiermit zu tun.


----------



## Xyz1 (11. Dez 2017)

mrBrown hat gesagt.:


> Dir ist schon aufgefallen


.... Ich habe Seite 3 bis 3 gelesen, das langt schon.

Wenn seine Java Installation falsch ist, können wir relativ wenig da machen.

Aber dennoch: `java -version` und

```
System.out.println(Charset.availableCharsets());
System.out.println(Charset.forName("UTF-8"));
System.out.println(Charset.isSupported("UTF-8"));
```

Da muss dann sowas stehen wie `UTF-8=UTF-8`.

Wenn nicht, mussers halt proprietär machen, so wie ich es beschrieben habe.


----------



## Stoegizzle (11. Dez 2017)

ich installier drjava einfach mal neu vllt hilfts ja


----------



## mrBrown (11. Dez 2017)

DerWissende hat gesagt.:


> Wenn nicht, mussers halt proprietär machen, so wie ich es beschrieben habe.


Merkst du eigentlich selbst, was für einen Unsinn du redest?

Das was du beschrieben hast ist weder proprietär, noch ändert es irgendwas an dem Problem.
Falls du es nicht bemerkt hast, du nutzt selbst explizit UTF-8 - der Fehler fliegt also trotzdem.
Und was du da mit FileWriter willst erschließt sich wohl nur dir, mit UTF-8 wird da zumindest nicht gemacht - schlimmer noch, was da passiert ist quasi zufällig.


----------



## mrBrown (11. Dez 2017)

Stoegizzle hat gesagt.:


> ich installier drjava einfach mal neu vllt hilfts ja


Einen Versuch ist's wert, ich drück dir die Daumen


----------



## Stoegizzle (11. Dez 2017)

ok des macht leider keinen unterschied -.- fuck was mach ich etz?


----------



## mrBrown (11. Dez 2017)

Stoegizzle hat gesagt.:


> ok des macht leider keinen unterschied -.- fuck was mach ich etz?



Das:


mrBrown hat gesagt.:


> Dann wende dich an den Prof/Tutor/Whatever.





mrBrown hat gesagt.:


> Und am besten noch die gesamte Fehlermeldung


----------



## Xyz1 (11. Dez 2017)

Stoegizzle hat gesagt.:


> fuck was mach ich etz?


Seid ihr zu xxx zu lesen?

Was gibt `System.out.println(Charset.availableCharsets());` aus?

(Ich mein, dass mrbrown das nicht "kann" wusste ich schon -.- )
Aber ich ziehe mich aus dem Thema raus, auf Kindergarten keine Lust.


----------



## X5-599 (11. Dez 2017)

@All

Sind wir sicher dass nicht einfach ein Errorhandling fehlte? á la: try/catch bzw throws.

@Stoegizzle
Kommt dein Error beim Kompillieren oder bei der Ausführung?


```
byte[] bytes = str.getBytes( "UTF-8" );
```


----------



## mrBrown (11. Dez 2017)

X5-599 hat gesagt.:


> Sind wir sicher dass nicht einfach ein Errorhandling fehlte? á la: try/catch bzw throws.


Du hast Recht -.-

Das fast schlimmste an IDEs zum Programmieren lernen; niemand versteht den Unterschied zwischen Compiletime und Runtime-Fehlern...


----------



## truesoul (11. Dez 2017)

DerWissende hat gesagt.:


> Lass dich von dem Quatsch von den beiden nicht ablenken....





DerWissende hat gesagt.:


> Seid ihr zu xxx zu lesen?
> 
> Was gibt `System.out.println(Charset.availableCharsets());` aus?
> 
> ...



Ja so wie du dich verhältst, ist sehr erwachsen.


----------



## Xyz1 (11. Dez 2017)

@truesoul :
Ist doch so.  Es wurde nach Hilfe gefragt, dann kamen ein paar Beiträge die man nicht "Beiträge" nennen kann - und meiner zur Fehlerursache wird nicht beachtet. 

Dann macht's alleine.


----------



## truesoul (11. Dez 2017)

DerWissende hat gesagt.:


> @truesoul :
> Ist doch so.  Es wurde nach Hilfe gefragt, dann kamen ein paar Beiträge die man nicht "Beiträge" nennen kann - und meiner zur Fehlerursache wird nicht beachtet.
> 
> Dann macht's alleine.



Dann überlege mal woran es liegt. Und alle Beiträge können hilfreich sein, auch wenn es dir nicht passt.


----------



## Stoegizzle (11. Dez 2017)

der fahler kommt beim compilen aber was ist mit try etc gemeint?


----------



## Xyz1 (11. Dez 2017)

Stoegizzle hat gesagt.:


> der fahler kommt beim compilen


Lolli, Fehlerbehandlung. xD


----------



## Stoegizzle (11. Dez 2017)

ja hab kein plan wie man solche fehler behandelt


----------



## Stoegizzle (11. Dez 2017)

Hallo Gemeinschaft  
Ich habe folgendes Problem: Ich muss für eine universitäre Arbeit ein Base64 Programm schreiben dass einen Text kodiert bzw dekodiert. Nun stoße ich bereits am Anfang auf ein Problem: bei der Speicherplatzberechnung weiss ich nicht genau wie ich den string darauf untersuchen kann wie viele Umlaute bzw"ß" er enthält -.-
Bitte um Hilfe stehe mega am Schlauch.


----------



## Xyz1 (11. Dez 2017)

Naja wo ein Fehler möglich ist ist eine Fehlerbehandlung zwingend....


----------



## Stoegizzle (11. Dez 2017)

ja allerdings sind wir im studium noch nicht so weit lerne seit 7 wochen erst java


----------



## mrBrown (11. Dez 2017)

Stoegizzle hat gesagt.:


> ja allerdings sind wir im studium noch nicht so weit lerne seit 7 wochen erst java


Dann nutz eine andere Methode, z.B die, die ein Charset bekommt


----------

