docs: private static String escapeSpecialAsciiAndNonAscii(String path) {
      int len = path.length(), ch;
      StringBuilder buffer = new StringBuilder(len * 3);
      // change C:/blah to /C:/blah
      if (len >= 2 && path.charAt(1) == ':') {
        ch = Character.toUpperCase(path.charAt(0));
        if (ch >= 'A' && ch <= 'Z') {
          buffer.append('/');
        }
      }
      // for each character in the path
      int i = 0;
      for (i = 0; i < len; i++) {
        ch = path.charAt(i);
        // if it's not an ASCII character, break here, and use UTF-8 encoding
        if (ch >= 128) {
          break;
        }
        if (gNeedEscaping[ch]) {
          buffer.append('%');
          buffer.append(gAfterEscaping1[ch]);
          buffer.append(gAfterEscaping2[ch]);
        } else {
          buffer.append((char) ch);
        }
      }
      // we saw some non-ascii character
      if (i < len) {
        // get UTF-8 bytes for the remaining sub-string
        byte[] bytes = null;
        byte b;
        bytes = path.substring(i).getBytes(StandardCharsets.UTF_8);
        len = bytes.length;
        // for each byte
        for (i = 0; i < len; i++) {
          b = bytes[i];
          // for non-ascii character: make it positive, then escape
          if (b < 0) {
            ch = b + 256;
            buffer.append('%');
            buffer.append(gHexChs[ch >> 4]);
            buffer.append(gHexChs[ch & 0xf]);
          } else if (gNeedEscaping[b]) {
            buffer.append('%');
            buffer.append(gAfterEscaping1[b]);
            buffer.append(gAfterEscaping2[b]);
          } else {
            buffer.append((char) b);
          }
        }
      }
      return buffer.toString();
    }