# String.substring und UTF-16-Konformität [solved]



## wolfgke (17. Aug 2008)

Hallo,
bekanntlich sind in Java Strings ja UTF-16 codiert.

Laut http://de.wikipedia.org/wiki/UTF-16 werden die Zeichen U+10000 bis U+10FFFF durch 2 UTF-16-Zeichen codiert. Was passiert nun, wenn ich auf einem String, welcher aus genau einem solchen Zeichen besteht String.substring(0,1) ausführe: beachtet Java korrekt, dass trotzdem 2 UTF-16-Wörter zur Codierung erforderlich sind oder wird Java (inkorrekterweise) nur den ersten Character verwenden und damit einen inkorrekten String erzeugen?

Grüße
wolfgke


----------



## SlaterB (17. Aug 2008)

vielleicht steht es hier:
http://itblog.eckenfels.net/archives/17-Java-und-Unicode.html


----------



## wolfgke (17. Aug 2008)

@SlaterB

In dem Text stehen eine Menge interessanter Dinge. Leider wird in den Codebeispielen dort dem von mir erwähnten Problem aus dem Weg gegangen.


----------



## didjitalist (18. Aug 2008)

String#substring zerlegt einen String _korrekt_ auf Basis des zugrundeliegenden char arrays. Diese supplementary characters werden dabei also als zwei Zeichen behandelt. Das zwingend notwendig, damit der Vertrag "x.substring( 0, n ).length == n" eingehalten werden kann.
Wenn du diese Unicodezeichen gesondert behandeln willst, bietet dir die String Klasse Methoden an, die mit codePoints arbeiten.


----------



## Murray (18. Aug 2008)

wolfgke hat gesagt.:
			
		

> bekanntlich sind in Java Strings ja UTF-16 codiert.


Das würde ich so nicht sagen - Strings sind in Java erstmals Unicode, und UTF-16 ist ja  - wie z.B. UTF-8 oder ISO-8859-1 - ein Encoding, also eine Abbildung der Unicode-Zeichen in eine andere Darstellung. Und solange Du bei der Unicode-Repräsentation bleibst und nur mit String, Character und char arbeitest, ohne dazwischen mal per String#getBytes oder "char-auf-int-Cast" die Unicode-Welt zu verlassen, wird kein Encoding verwendet.


----------



## wolfgke (23. Aug 2008)

Danke an alle. Jetzt wurde die Frage zufriedenstellend beantwortet.


----------

