2016-04-27 13 views
3

Seit java 8 String.chars() gibt einen IntStream zurück, und die beste Antwort, die ich gefunden habe, wenn Sie einen Strom von Zeichen möchten, ist durch Casting i -> (char) ich, ich frage mich, ob jemand weiß, ob dies richtig funktioniert UTF-16-Zeichen, die tatsächlich 8 Bytes belegen?Funktioniert Java 8 String.chars() ordnungsgemäß mit 8-Byte-Zeichen?

+1

8 Bytes? Passen nicht alle Unicode-Zeichen in höchstens zwei UTF-16-Code-Einheiten (d. H. 4 Bytes)? – Thilo

Antwort

1

Abhängig von Ihrer Definition von richtig: Nein, tut es nicht.

Ein Java char ist eine 16-Bit-UTF-16-Code-Einheit. Alles, was länger ist, wird als zwei char (as "surrogate pairs") dargestellt. Das gleiche gilt für String#length(). Es wird die Nummer char zurückgegeben, so dass Ihr "langes Zeichen" als zwei zählt.

Der Grund dafür, dass IntStream zurückgegeben wird, ist just to not need to introduce a CharStream class. Die enthaltenen Daten befinden sich immer noch im 16-Bit-Bereich char.

jedoch gibt es zusätzlich zu .codePoints()chars(), die die 32-Bit-Unicode-Codepunkte zurückkehrt (auch als IntStream).

+0

Rechts. Aber was du sagst ist, ich muss die Ints selbst analysieren, richtig? – tumunu

+1

Was meinst du mit "parse"? – Thilo

+0

Mit "parse" meine ich, wenn ich den nächsten int-Wert im IntStream ansehe, muss ich den Wert untersuchen, um zu sehen, ob das int, nachdem es tatsächlich Teil desselben char ist. – tumunu