docs: private static String uncorrect(final String s) {
          if (s == null) {
              return null;
          }
          if (s.indexOf('%') == -1) {
              // Optimization, nothing to uncorrect here
              return s;
          }
          final StringBuilder sbuf = new StringBuilder();
          final int l = s.length();
          int ch;
          int b = 0, sumb = 0;
          boolean applyUTF8dec = false;
  
          for (int i = 0, more = -1; i < l; i++) {
              // Get next byte b from URL segment s
              final char current = s.charAt(i);
              ch = current;
              switch (ch) {
              case '%':
                  if (i + 2 < s.length()) {
                      // Avoid java.lang.StringIndexOutOfBoundsException...
                      ch = s.charAt(++i);
                      final int hb = (Character.isDigit((char) ch) ? ch - '0'
                              : 10 + Character.toLowerCase((char) ch) - 'a') & 0xF;
                      ch = s.charAt(++i);
                      final int lb = (Character.isDigit((char) ch) ? ch - '0'
                              : 10 + Character.toLowerCase((char) ch) - 'a') & 0xF;
                      b = (hb << 4) | lb;
                      applyUTF8dec = true;
                  }
                  break;
              default:
                  b = ch;
                  applyUTF8dec = false;
              }
              // Decode byte b as UTF-8, sumb collects incomplete chars
              if (applyUTF8dec) {
                  if ((b & 0xc0) == 0x80) {
                      // 10xxxxxx (continuation byte)
                      sumb = (sumb << 6) | (b & 0x3f); // Add 6 bits to sumb
                      if (--more == 0) {
                          sbuf.append((char) sumb); // Add char to sbuf
                      }
                  } else if ((b & 0x80) == 0x00) {
                      // 0xxxxxxx (yields 7 bits)
                      sbuf.append((char) b); // Store in sbuf
                  } else if ((b & 0xe0) == 0xc0) {
                      // 110xxxxx (yields 5 bits)
                      sumb = b & 0x1f;
                      more = 1; // Expect 1 more byte
                  } else if ((b & 0xf0) == 0xe0) {
                      // 1110xxxx (yields 4 bits)
                      sumb = b & 0x0f;
                      more = 2; // Expect 2 more bytes
                  } else if ((b & 0xf8) == 0xf0) {
                      // 11110xxx (yields 3 bits)
                      sumb = b & 0x07;
                      more = 3; // Expect 3 more bytes
                  } else if ((b & 0xfc) == 0xf8) {
                      // 111110xx (yields 2 bits)
                      sumb = b & 0x03;
                      more = 4; // Expect 4 more bytes
                  } else {
                      sumb = b & 0x01;
                      more = 5; // Expect 5 more bytes
                  }
              } else {
                  sbuf.append(current);
                  // Do not expect other continuation.
                  more = -1;
              }
              // We don't test if the UTF-8 encoding is well-formed
          }
          return sbuf.toString();
      }