URLEncoder、URLDecoder、StringUtils.replaceEach

本文介绍了URLEncoder和URLDecoder在Java中的使用,用于中文字符与URL编码格式之间的转换。通过示例展示了如何进行编码和解码操作,并利用StringUtils的replaceEach方法进行局部替换。同时提供了URL编码对照表的参考链接,帮助理解编码过程。

URLEncoder:将中文字符转换成url编码格式

	@Test
	public void testURLEncoder(){
		String httpCode="[你好]";
		try {
			httpCode= URLEncoder.encode(httpCode,"UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		System.out.println(httpCode);		//输出==>%5B%E4%BD%A0%E5%A5%BD%5D
	}

URLDecoder:将url编码格式解码

	@Test
	public void testURLDecoder(){
		//"[你好]"的url编码格式
		String httpCode="%5B%E4%BD%A0%E5%A5%BD%5D";
		try {
			httpCode= URLDecoder.decode(httpCode,"UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		System.out.println(httpCode);		//输出==>[你好]
	}

StringUtils.replaceEach:局部替换字符
URL编码对照表可以参照这篇博客:https://blog.csdn.net/sinat_34439107/article/details/78242584

	@Test
	public void test(){
		String[] urlCode=new String[]{"%5B","%5D"};
		String[] trueCode=new String[]{"[","]"};
		//"[你好]"的url编码格式
		String httpCode="%5B%E4%BD%A0%E5%A5%BD%5D";
		httpCode=StringUtils.replaceEach(httpCode,urlCode,trueCode);
		System.out.println(httpCode);	//输出==>[%E4%BD%A0%E5%A5%BD]
	}
param=appkey=F20C0D9292C195A89EFA4EC809165AF1&ts=1755862448&XuDianCWYBH=MA2RJ6WHBEJHAA1DZM1012X0NA1D&QrUrl=https%3A%2F%2Fzlzx.zjamr.zj.gov.cn%2Fpzcode%2Fpwb%2FMA2RJ6WHBEJHAA1DZM1012X0NA1D&data=%7B%22XuDianCWYBH%22%3A%22MA2RJ6WHBEJHAA1DZM1012X0NA1D%22%2C%22XuDianCSCQY%22%3A%22%E6%98%9F%E6%81%92%E7%94%B5%E6%BA%90%28%E6%BB%81%E5%B7%9E%29%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8%22%2C%22XuDianCSCDM%22%3A%2291341192MA2RJ6WH82%22%2C%22XuDianCLX%22%3A%22%E9%94%82%E7%94%B5%22%2C%22XuDianCRL%22%3A%2220%22%2C%22XuDianCXH%22%3A%22DB1.5-BM4820%22%2C%22XuDianCZL%22%3A%22%E2%89%A49.3%22%2C%22XuDianCCC%22%3A%22184%C2%B12%22%2C%22XuDianCCK%22%3A%22156%C2%B12%22%2C%22XuDianCCG%22%3A%22300%C2%B12%22%2C%22ZhiXingBZH%22%3A%22GB%2FT36972-2018%22%2C%22ShengChanRQ%22%3A%222025-08-11%22%2C%22YouXiaoRQ%22%3A%222029-08-11%22%2C%22ZiBianM%22%3A%22BEJHAA1DZM1012X0NA1D%22%2C%22ZhengJiTX%22%3A%22%E9%94%B0%E9%85%B8%E9%94%82%22%7D&ShengChanQYDM=91341192MA2RJ6WH82 appsecret=8149A679C3AF75685DB8B3272168DD9A,用这两个参数去跑这个java方法,告诉我最后返回的结果,java代码是:package com.fd.zpm.util; import cn.hutool.core.date.DateTime; import com.alibaba.fastjson.JSON; import com.fd.zpm.util.txt.FdSM4Enc; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.util.StringUtils; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URLDecoder; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; public class SignCommonUtil { private static final String data_info = "加密数据"; private static final Logger logger = LoggerFactory.getLogger(SignCommonUtil.class); public static void main(String[] args) throws IOException { //String result = "appKey=3040D99FB24475563093D87AD1251C72&ts=1740721675325type=1&data=\"{\\\\\\\"busiID\\\\\\\": \\\\\\\"1312312\\\\\\\", \\\\\\\"traceCode\\\\\\\": \\\\\\\"1\\\\\\\", \\\\\\\"productId\\\\\\\": \\\\\\\"2\\\\\\\", \\\\\\\"productDate\\\\\\\": \\\\\\\"3\\\\\\\", \\\\\\\"warrantyPeriod\\\\\\\": \\\\\\\"4\\\\\\\", \\\\\\\"batchNum\\\\\\\": \\\\\\\"5\\\\\\\", \\\\\\\"inspReportUrl\\\\\\\": \\\\\\\"6\\\\\\\", \\\\\\\"isOpenReport\\\\\\\": \\\\\\\"1\\\\\\\", \\\\\\\"sourceCode\\\\\\\": \\\\\\\"8\\\\\\\", \\\\\\\"remarks1\\\\\\\": \\\\\\\"9\\\\\\\", \\\\\\\"productInfo\\\\\\\": {\\\\\\\"busiID\\\\\\\": \\\\\\\"1312312\\\\\\\", \\\\\\\"productId\\\\\\\": \\\\\\\"1\\\\\\\", \\\\\\\"productCode\\\\\\\": \\\\\\\"2\\\\\\\", \\\\\\\"productDelName\\\\\\\": \\\\\\\"3\\\\\\\", \\\\\\\"model\\\\\\\": \\\\\\\"4\\\\\\\", \\\\\\\"prodExeStd\\\\\\\": \\\\\\\"5\\\\\\\", \\\\\\\"nationalStandards\\\\\\\": \\\\\\\"6\\\\\\\", \\\\\\\"certNo\\\\\\\": \\\\\\\"7\\\\\\\", \\\\\\\"cccNo\\\\\\\": \\\\\\\"8\\\\\\\", \\\\\\\"manualUrl\\\\\\\": \\\\\\\"9\\\\\\\", \\\\\\\"sourceCode\\\\\\\": \\\\\\\"10\\\\\\\"}, \\\\\\\"prodFlowInfoList\\\\\\\": [{\\\\\\\"busiID\\\\\\\": \\\\\\\"1312312\\\\\\\", \\\\\\\"traceCode\\\\\\\": \\\\\\\"追溯码\\\\\\\", \\\\\\\"serialNo\\\\\\\": \\\\\\\"生产流向流水号\\\\\\\", \\\\\\\"sreditCode\\\\\\\": \\\\\\\"生产单位社会统一信用代码\\\\\\\", \\\\\\\"salesDate\\\\\\\": \\\\\\\"销售时间\\\\\\\", \\\\\\\"vSalesTime\\\\\\\": \\\\\\\"0\\\\\\\", \\\\\\\"buyerName\\\\\\\": \\\\\\\"购方名称\\\\\\\", \\\\\\\"buyerCode\\\\\\\": \\\\\\\"购方社会统一信用代码\\\\\\\", \\\\\\\"vBuyerName\\\\\\\": \\\\\\\"1\\\\\\\", \\\\\\\"buyerAddress\\\\\\\": \\\\\\\"购方地址\\\\\\\", \\\\\\\"vBuyerAddress\\\\\\\": \\\\\\\"1\\\\\\\", \\\\\\\"buyerTel\\\\\\\": \\\\\\\"购方联系方式\\\\\\\", \\\\\\\"vBuyerTel\\\\\\\": \\\\\\\"1\\\\\\\", \\\\\\\"sourceUrl\\\\\\\": \\\\\\\"追溯途径源链接\\\\\\\", \\\\\\\"sourceCode\\\\\\\": \\\\\\\"追溯信息来源\\\\\\\"}, {\\\\\\\"busiID\\\\\\\": \\\\\\\"1312312\\\\\\\", \\\\\\\"traceCode\\\\\\\": \\\\\\\"追溯码2\\\\\\\", \\\\\\\"serialNo\\\\\\\": \\\\\\\"生产流向流水号2\\\\\\\", \\\\\\\"sreditCode\\\\\\\": \\\\\\\"生产单位社会统一信用代码2\\\\\\\", \\\\\\\"salesDate\\\\\\\": \\\\\\\"销售时间2\\\\\\\", \\\\\\\"vSalesTime\\\\\\\": \\\\\\\"1\\\\\\\", \\\\\\\"buyerName\\\\\\\": \\\\\\\"购方名称2\\\\\\\", \\\\\\\"buyerCode\\\\\\\": \\\\\\\"购方社会统一信用代码2\\\\\\\", \\\\\\\"vBuyerName\\\\\\\": \\\\\\\"1\\\\\\\", \\\\\\\"buyerAddress\\\\\\\": \\\\\\\"购方地址2\\\\\\\", \\\\\\\"vBuyerAddress\\\\\\\": \\\\\\\"1\\\\\\\", \\\\\\\"buyerTel\\\\\\\": \\\\\\\"购方联系方式2\\\\\\\", \\\\\\\"vBuyerTel\\\\\\\": \\\\\\\"1\\\\\\\", \\\\\\\"sourceUrl\\\\\\\": \\\\\\\"追溯途径源链接2\\\\\\\", \\\\\\\"sourceCode\\\\\\\": \\\\\\\"追溯信息来源2\\\\\\\"}], \\\\\\\"prodUnitInfo\\\\\\\": {\\\\\\\"busiID\\\\\\\": \\\\\\\"1312312\\\\\\\", \\\\\\\"sreditName\\\\\\\": \\\\\\\"联系方式\\\\\\\", \\\\\\\"sreditCode\\\\\\\": \\\\\\\"生产单位统一社会信用代码\\\\\\\", \\\\\\\"address\\\\\\\": \\\\\\\"生产/注册地址\\\\\\\", \\\\\\\"tel\\\\\\\": \\\\\\\"生产单位名称\\\\\\\", \\\\\\\"businessLicenseUrl\\\\\\\": \\\\\\\"营业执照(链接)\\\\\\\", \\\\\\\"provinceCode\\\\\\\": \\\\\\\"所在省编码\\\\\\\", \\\\\\\"cityCode\\\\\\\": \\\\\\\"所在地级市编码\\\\\\\", \\\\\\\"districtCode\\\\\\\": \\\\\\\"所在县/区编码\\\\\\\", \\\\\\\"sourceCode\\\\\\\": \\\\\\\"追溯信息来源\\\\\\\"}}\"&sign=a11b34caca9239ad4fe769726ba9f177"; // String param = "appKey=" + appKey +"&appsecret="+appsecret+ "&ts=" + ts + "&creditCode=" + creditCode // + "&productName=" + productName + "&specifications=" + specifications + "&sPCategory=" + sPCategory // + "&serialCode=" + serialCode; // String paramDc = "appkey=" + appKey +"&appsecret="+appsecret + "&ts=" + ts + "&ShengChanQYDM=" + ShengChanQYDM +"&ZhenCheBM="+ZhenCheBM+"&QrUrl=" +QrUrl + "&data=" + data; // String param = "appkey=" + appKey + "&ts=" + ts + "&ShengChanQYDM=" + ShengChanQYDM // + "&ZhenCheBM=" + ZhenCheBM + "&QrUrl=" + QrUrl + "&data=" + data; try { // String str = JSON.toJSONString(s); CheckSign //appSecret System.out.println(CreareSignQueryStringNew(param, appsecret)); System.out.println(); } catch (Exception e) { throw new RuntimeException(e); } } private static String CreareSignQueryStringNew(String formStr, String appSecret) throws UnsupportedEncodingException { String signQueryString = ""; String sign = ""; //将参数存入字符数组 String[] dataArry = formStr.split("&"); //定义字典,将参数按照键值对存入字典中 Map<String, String> dics = new HashMap<String, String>(); dics.put("appsecret", appSecret); //遍历字符数组 for (int i = 0; i <= dataArry.length - 1; i++) { //当前参数值 String dataParm = dataArry[i]; //"="的索引值 int dIndex = dataParm.indexOf("="); //参数名做为key String key = dataParm.substring(0, dIndex); //参数值做为Value String value = dataParm.substring(dIndex + 1, dIndex + 1 + dataParm.length() - dIndex - 1); //将编码后的Value解码 String deValue = URLDecoder.decode(value, "UTF-8"); if (!"__VIEWSTATE".equals(key)) { //将参数以键值对存入字典 dics.put(key, deValue); } if ("sign".equals(key)) { sign = deValue; } if (!"__VIEWSTATE".equals(key) && !"sign".equals(key)) { //将参数以键值对存入字典 dics.put(key, deValue); } } List<String> arrKeys = new ArrayList<>(dics.keySet()); Collections.sort(arrKeys, String::compareTo); for (String key : arrKeys) { String value = dics.get(key); String test = java.net.URLEncoder.encode(value, "UTF-8"); signQueryString+=((signQueryString.length() == 0 ? "" : "&") + key + "=" + test); } String createsign = MD5Encrypt32(signQueryString); return createsign; } //获取当前时间段额时间戳 public static String GetTimeStamp() { long ts = System.currentTimeMillis(); return String.valueOf(ts); } public static String MD5Encrypt32(String password) { String cl = password; StringBuilder pwd = new StringBuilder(); try { // 实例化一个MD5对象 MessageDigest md5 = MessageDigest.getInstance("MD5"); // 加密后是一个字节类型的数组,这里要注意编码的选择,这里使用UTF-8编码 byte[] s = md5.digest(cl.getBytes(StandardCharsets.UTF_8)); // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得 for (int i = 0; i < s.length; i++) { // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(toUpperCase)则格式后的字符是大写字符 pwd.append(String.format("%02x", s[i])); } } catch (NoSuchAlgorithmException e) { logger.error(e.getMessage()); } return pwd.toString().toUpperCase(); } }
最新发布
08-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值