Die Länge von Strings zählen wie?
Kann mir jemand erklären, wie man auf den Output von 40 bei diesem String vers1 kommt? Ich komm nur auf 39.. danke im Voraus!
String vers1 = "Wer reitet so spät durch Nacht und Wind";
String vers2 = "Es ist der Vater mit seinem Kind.";
System.out.println(vers1.length() + " " + vers2.length());
Java?
Ja, sorry, vergessen zu schreiben.
Wer sagt, dass es 40 sein soll? Hast du vielleicht das Fragezeichen oder sonst ein Zeichen vergessen?
Wenn ich das Programm ausführe (mit Eclipse), wird 40 und 33 ausgegeben. Ich verstehe aber nicht, warum.
3 Antworten
Mit Copy-Paste direkt aus deiner Frage:
jshell> String vers1 = "Wer reitet so spät durch Nacht und Wind";
...> String vers2 = "Es ist der Vater mit seinem Kind.";
...> System.out.println(vers1.length() + " " + vers2.length());
vers1 ==> "Wer reitet so spät durch Nacht und Wind"
vers2 ==> "Es ist der Vater mit seinem Kind."
39 33
Tut doch, was es soll.
Ich könnte mir allenfalls vorstellen, dass du versehentlich ein nicht druckbares Zeichen eingefügt hast, etwa einen zero-width joiner.
Da du erwähntest, dass du das aus einem Skriptum kopiert hast: möglicherweise handelt es sich hier um den Fall eines Combining Character, wie sie oft von LaTeX generiert werden.
https://unicode.org/faq/char_combmark.html
Dabei werden Umlaute sozusagen aus den einzelnen Bestandteilen zusammengesetzt, und das "ä" besteht tatsächlich aus zwei Zeichen. Schaut optisch aber genauso aus. Diese Art der Kodierung führt gerne zu diversen Problemen, etwa beim Vergleich von Strings, und wird daher durch Normalisierung möglichst vermieden. Man kann sie aber auch "künstlerisch" verwenden:
Da müsste 39 bei rauskommen. Versuch es mal mit einem anderen String in einem leeren Projekt, wo du nur das machst.
Bei mir geht es, 39 kommt raus.
Ja.. habs vom Dokument meines Professors rauskopiert und da war wahrscheinlich so ein nicht sichtbares Zeichen dazwischen.. habs neu geschrieben und jetzt funktionierts. Danke 🙏
Der Umlaut "ä" ?
Nachtrag nach Kommentar:
Beispiel nach "export LANG=en_US.iso885915 oder "export LANG=de_DE@euro" (bei einer UTF8 Kodierung ist es korrekt).
$ export LANG=en_US.iso885915
jshell> String vers1 = "Wer reitet so spät durch Nacht und Wind";
vers1 ==> "Wer reitet so spät durch Nacht und Wind"
jshell> String vers2 = "Es ist der Vater mit seinem Kind.";
vers2 ==> "Es ist der Vater mit seinem Kind."
jshell> System.out.println(vers1.length() + " " + vers2.length());
40 33
Naja. Auch wenn der Sourcecode in Latin-9 (ISO-8859-15) ist, übersetzt sich ein "ä" stets auf einen einzigen Codepoint. In Latin-x ist jedes Zeichen sowieso immer genau 1 Byte lang, und Java arbeitet intern selbst immer mit Unicode, d.h. die Ursprungskodierung ist egal.
Dein Fall ist dann möglich, wenn es eine Fehlkodierung ist: d.h. ich habe Sourcecode in UTF-8, sage dem Compiler aber, dass es sich um eine andere Kodierung wie Latin-9 handelt. Das sichtbare Resultat wäre dann aber eben kein "ä" mehr, sondern die den Bytes C3 und A4 entsprechenden Zeichen: À
Was soll ich jetzt damit anfangen? Ich habe Dir oben gezeigt, dass bei einer entsprechenden Kodierung eine 40 herauskommen kann und das war das Problem des Fragestellers. Darauf habe ich mit einer Idee geantwortet, die mir spontan und mit langjähriger Erfahrung begründet, in den Kopf geschossen ist. Und ob das einen Fehlkodierung ist oder nicht, ist doch für den Fragesteller erstmal völlig irrelevant.
Ansonsten melde ich mich bei Dir wieder, wenn ich weiteren Bedarf auf Nachhilfe in Informatik haben sollte.
Und ob das einen Fehlkodierung ist oder nicht, ist doch für den Fragesteller erstmal völlig irrelevant.
Vielleicht kann der FS auch was daraus lernen - du hast das ja nicht mehr nötig, kannst es also getrost ignorieren. :)
Tatsächlich.. 🤦🏻♂️ Jetzt funktionierts, vielen Dank!!