Ну то есть, четырёхбайтовые Unicode codepoint-ы?
Надо брать java –version >= 18, потому что
https://openjdk.org/jeps/400
А дальше как?
as of Java 7 you can use constants for charset name such as StandardCharSets.UTF_8
«В Java, класс IntStream представляет поток целых чисел, и каждый элемент в этом потоке занимает 4 байта, поскольку int в Java является 32-битным целым числом, независимо от платформы, включая Intel64.»
IntStream combinedStream = IntStream.concat(stream1, stream2);
Как зачитать IntStream из stdin? записать в stdout?
since Java 8, public IntStream String.codePoints() (inherited from CharSequence) and int String.codePointCount(). Такое преобразование выглядит странным, излишним: stream.mapToObj(codepoint -> String.valueOf(Character.toChars(codepoint))) .forEach(System.out::println); в нём сначала происходит конвертация в кодировку UCS-16, а затем в UTF-8, а хотелось бы сразу напрямую. Нужно обойтись без использования класса String вообще.
Вручную - многобукв:
stream.forEach(codepoint -> {
if (codepoint < 0x80) {
System.out.write(codepoint);
} else if (codepoint < 0x800) {
System.out.write(0xC0 | (codepoint >> 6));
System.out.write(0x80 | (codepoint & 0x3F));
} else if (codepoint < 0x10000) {
System.out.write(0xE0 | (codepoint >> 12));
System.out.write(0x80 | ((codepoint >> 6) & 0x3F));
System.out.write(0x80 | (codepoint & 0x3F));
} else {
System.out.write(0xF0 | (codepoint >> 18));
System.out.write(0x80 | ((codepoint >> 12) & 0x3F));
System.out.write(0x80 | ((codepoint >> 6) & 0x3F));
System.out.write(0x80 | (codepoint & 0x3F));
}
});
UPD: или может быть какая-нибудь есть библиотека, в которой символы 3-х байтовые и весь рантайм под такие API переделан?
типа com.google.protobuf.ByteString
Вот посмотрите, как лапочка Дональд Кнут. У него текст состоит из страниц, на страницах расположены строки, строки состоят из боксов. Логично же текстовый документ точно так же читать - чтение текста, это некоторая последовательность обхода этих строк и боксов в каждой строке. Если надо прочитать что-то специальное (математическую формулу), то там другие правила чтения, дерево боксов, но и формулу тоже можно прочитать, просто на другом уровне. Вот почему файловые API так же не устроены? Где в Java классы TextFileReader, TextLineReader, TextBoxReader? Последний можно было бы параметризовать каким-нибудь типом, который описывает, что такое «символ». То-ли LaTeX парсит, толи Unicode GraphemeCluster-ы собирает из Unicode Codepoint, это уже мелкие детали, а наше дело - крупные.