Die Länge von Strings zählen wie?

verreisterNutzer  03.12.2023, 12:04

Java?

sprmax 
Fragesteller
 03.12.2023, 12:05

Ja, sorry, vergessen zu schreiben.

jo135  03.12.2023, 12:04

Wer sagt, dass es 40 sein soll? Hast du vielleicht das Fragezeichen oder sonst ein Zeichen vergessen?

sprmax 
Fragesteller
 03.12.2023, 12:05

Wenn ich das Programm ausführe (mit Eclipse), wird 40 und 33 ausgegeben. Ich verstehe aber nicht, warum.

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.

sprmax 
Fragesteller
 03.12.2023, 12:09

Tatsächlich.. 🤦🏻‍♂️ Jetzt funktionierts, vielen Dank!!

0
jo135  03.12.2023, 13:39
@sprmax

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:

https://lingojam.com/WeirdTextGenerator

1

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.

sprmax 
Fragesteller
 03.12.2023, 12:10

Ja.. habs vom Dokument meines Professors rauskopiert und da war wahrscheinlich so ein nicht sichtbares Zeichen dazwischen.. habs neu geschrieben und jetzt funktionierts. Danke 🙏

1

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
sprmax 
Fragesteller
 03.12.2023, 12:07

Ehrlich? Werden Umlaute doppelt gezählt??

0
jo135  03.12.2023, 12:08

Was meinst du damit? Das ist ein Codepoint wie jeder andere.

0
evtldocha  03.12.2023, 12:35
@jo135
Das ist ein Codepoint wie jeder andere.

Bei einer UTF-8-Kodierung ja. Schau mein ergänztes Beispiel an.

0
jo135  03.12.2023, 13:23

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: À

0
evtldocha  03.12.2023, 13:30
@jo135

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.

0
jo135  03.12.2023, 13:30
@jo135

Ein anderer (doch eher exotischer) Fall wäre die Verwendung von Combining Characters, d.h. man setzt das "ä" aus einem "a" und U+0308 zusammen. Das scheint mir in dem Fall sogar nicht ausgeschlossen, weil's auch in LaTeX oft gemacht wird.

0
jo135  03.12.2023, 13:31
@evtldocha
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. :)

0