/** * 解码application/x-www-form-urlencoded字符 * * @param content 被编码内容 * @return 编码后的字符 */ public static String decode(String content, String charset) { if (StrUtil.isBlank(content)) return content; String encodeContnt = null; try { encodeContnt = URLDecoder.decode(content, charset); } catch (UnsupportedEncodingException e) { throw new UtilException(StrUtil.format("Unsupported encoding: [{}]", charset), e); } return encodeContnt; }
/** * 从Http连接的头信息中获得字符集 * * @param conn HTTP连接对象 * @return 字符集 */ public static String getCharset(HttpURLConnection conn) { if (conn == null) { return null; } String charset = conn.getContentEncoding(); if (StrUtil.isBlank(charset)) { charset = ReUtil.get(CHARSET_PATTERN, conn.getContentType(), 1); } return charset; }
/** * 将URL参数解析为Map(也可以解析Post中的键值对参数) * * @param paramsStr 参数字符串(或者带参数的Path) * @param charset 字符集 * @return 参数Map */ public static Map<String, List<String>> decodeParams(String paramsStr, String charset) { if (StrUtil.isBlank(paramsStr)) { return Collections.emptyMap(); } // 去掉Path部分 int pathEndPos = paramsStr.indexOf('?'); if (pathEndPos > 0) { paramsStr = StrUtil.subSuf(paramsStr, pathEndPos + 1); } paramsStr = decode(paramsStr, charset); final Map<String, List<String>> params = new LinkedHashMap<String, List<String>>(); String name = null; int pos = 0; // 未处理字符开始位置 int i; // 未处理字符结束位置 char c; // 当前字符 for (i = 0; i < paramsStr.length(); i++) { c = paramsStr.charAt(i); if (c == '=' && name == null) { // 键值对的分界点 if (pos != i) { name = paramsStr.substring(pos, i); } pos = i + 1; } else if (c == '&' || c == ';') { // 参数对的分界点 if (name == null && pos != i) { // 对于像&a&这类无参数值的字符串,我们将name为a的值设为"" addParam(params, paramsStr.substring(pos, i), StrUtil.EMPTY); } else if (name != null) { addParam(params, name, paramsStr.substring(pos, i)); name = null; } pos = i + 1; } } if (pos != i) { if (name == null) { addParam(params, paramsStr.substring(pos, i), StrUtil.EMPTY); } else { addParam(params, name, paramsStr.substring(pos, i)); } } else if (name != null) { addParam(params, name, StrUtil.EMPTY); } return params; }
/** * 检测给定字符串是否为未知,多用于检测HTTP请求相关<br> * * @param checkString 被检测的字符串 * @return 是否未知 */ public static boolean isUnknow(String checkString) { return StrUtil.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString); }