public static byte[] stringToUtf8Bytes(String string) {
    int len = string.length();
    byte[] bytes = new byte[len * 3]; // Avoid having to reallocate.
    int outAt = 0;

    for (int i = 0; i < len; i++) {
      char c = string.charAt(i);
      if ((c != 0) && (c < 0x80)) {
        bytes[outAt] = (byte) c;
        outAt++;
      } else if (c < 0x800) {
        bytes[outAt] = (byte) (((c >> 6) & 0x1f) | 0xc0);
        bytes[outAt + 1] = (byte) ((c & 0x3f) | 0x80);
        outAt += 2;
      } else {
        bytes[outAt] = (byte) (((c >> 12) & 0x0f) | 0xe0);
        bytes[outAt + 1] = (byte) (((c >> 6) & 0x3f) | 0x80);
        bytes[outAt + 2] = (byte) ((c & 0x3f) | 0x80);
        outAt += 3;
      }
    }

    byte[] result = new byte[outAt];
    System.arraycopy(bytes, 0, result, 0, outAt);
    return result;
  }
Converts a string into its MUTF-8 form. MUTF-8 differs from normal UTF-8 in the handling of
character '\0' and surrogate pairs.

@param string {@code non-null;} the string to convert
@return {@code non-null;} the UTF-8 bytes for it
android/android_framework/dex-maker/src/main/java/com/android/dx/rop/cst/CstString.java