code: public final static int packBytesAfter1(int unicodeScalar, int utf8Len)
      {
          int packed_chars;
  
          switch (utf8Len) {
          default:
              throw new IllegalArgumentException("pack requires len > 1");
          case 2:
              packed_chars = getByte2Of2(unicodeScalar);
              break;
          case 3:
              packed_chars  = getByte2Of3(unicodeScalar);
              packed_chars |= getByte3Of3(unicodeScalar) << 8;
              break;
          case 4:
              packed_chars = getByte2Of4(unicodeScalar);
              packed_chars |= getByte3Of4(unicodeScalar) << 8;
              packed_chars |= getByte4Of4(unicodeScalar) << 16;
              break;
          }
          return packed_chars;
  
      }
docs: converts a unicode code point to a 0-3 bytes of UTF8
  encoded data and a length - note this doesn't pack
  a 1 byte character and it returns the start character.
  this is the unpacking routine
  while (_utf8_pretch_byte_count > 0 && offset < limit) {
  _utf8_pretch_byte_count--;
  buffer[offset++] = (byte)((_utf8_pretch_bytes >> (_utf8_pretch_byte_count*8)) & 0xff);
  }