А как из InputStreamReader читать старшие юникоды? (original) (raw)

Previous Entry Flag Next Entry

А как из InputStreamReader читать старшие юникоды?

Ну, то есть, пишу я упражнение, выглядит оно так:

InputStreamReader input = new InputStreamReader( getClass().getResourceAsStream("testfile.txt"), "UTF-8"); while(input.ready()) { Character inp_c = (char)input.read(); if( WordCount.containsKey(inp_c)) { Integer temp = WordCount.get(inp_c); temp++; WordCount.put(inp_c, temp); } else { WordCount.put(inp_c, 1); } }

Что меня раздражает - это приведение типа в строчке:
Character inp_c = (char)input.read();

Int, конечно, не проблема привести к char,

вот только Character может содержать символы из нескольких char'ов

(не, не может.). Точнее, все плоскости, кроме первой должны состоять больше чем из одного char'a.

АПД. Видимо, меня не поняли. Я прекрасно понимаю, что char - это не 8 бит, а 16.
Мне нужны код-пойнты, не влезающие в 16 бит, а именно старшие плоскости юникода - 14,15,16.

АПД2. Все, нагуглил.
http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html

Иными словами, полный пипец. Вместо нормальной инкапсуляции кодпойнта в класс, оракл говорит: вот вам суррогатные пары из двух char и трахайтесь как хотите.
Класс Character может расковырять вам 21битный инт на 2 char'a, а стандартное представление высшего юникода - это String.
Спасибо, дорогой оракл!