docs: private char getUTF8() {
      int res = getByte(pos);
      pos++; //FIXME tmp
  
      if (res < 128) { // one byte: 0-7F
        return (char) res;
      } else if (res >= 192 && res <= 247) {
  
        int count;
        if (res <= 223) { // two bytes: C0-DF
          count = 1;
          res = res & 0x1F;
        } else if (res <= 239) { // three bytes: E0-EF
          count = 2;
          res = res & 0x0F;
        } else { // four bytes: F0-F7
          count = 3;
          res = res & 0x07;
        }
  
        int b;
        for (int i = 0; i < count; i++) {
          pos++;
          if (pos == length || chars[pos] != '\\') {
            return 0x3F; //FIXME failed to decode UTF-8 char - return '?'
          }
          pos++;
  
          b = getByte(pos);
          pos++; //FIXME tmp
          if ((b & 0xC0) != 0x80) {
            return 0x3F; //FIXME failed to decode UTF-8 char - return '?'
          }
  
          res = (res << 6) + (b & 0x3F);
        }
        return (char) res;
      } else {
        return 0x3F; //FIXME failed to decode UTF-8 char - return '?'
      }
    }