docs: @Override
      protected final char nextChar() {
          if (currentChar != 0) {
              char ch = currentChar;
              this.currentChar = 0;
              return ch;
          }
          if (this.currentBuffer != null) {
              int remain = this.currentBuffer.remaining();
              if (remain == 0 && this.currentIndex + 1 >= this.buffers.length) return 0;
          }
          byte b1 = nextByte();
          if (b1 >= 0) {// 1 byte, 7 bits: 0xxxxxxx
              return (char) b1;
          } else if ((b1 >> 5) == -2 && (b1 & 0x1e) != 0) { // 2 bytes, 11 bits: 110xxxxx 10xxxxxx
              return (char) (((b1 << 6) ^ nextByte()) ^ (((byte) 0xC0 << 6) ^ ((byte) 0x80)));
          } else if ((b1 >> 4) == -2) { // 3 bytes, 16 bits: 1110xxxx 10xxxxxx 10xxxxxx
              return (char) ((b1 << 12) ^ (nextByte() << 6) ^ (nextByte() ^ (((byte) 0xE0 << 12) ^ ((byte) 0x80 << 6) ^ ((byte) 0x80))));
          } else { // 4 bytes, 21 bits: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
              throw new RuntimeException(new UnmappableCharacterException(4));
          }
      }