`
NoWhy
  • 浏览: 35776 次
  • 性别: Icon_minigender_1
  • 来自: 他乡
社区版块
存档分类
最新评论

x-www-form-urlencoded的解码

    博客分类:
  • Web
阅读更多
问题发生于,我想用tcpmon拦截页面提交数据。
由于post的数据都是经过urlencoded编码的,所以看到的数据如果是日文的话都是类似于“%8Ex%95%A5%8B%E0%8Az%8D%87%8Cv”这个样子的。
我想把它解码成原始数据,以便于调查。
于是使用了URLDecoder.decode方法进行解码,发现解码回来的数据有误
System.out.println(URLDecoder.decode("%8Ex%95%A5%8B%E0%8Az%8D%87%8Cv","windows-31j"));

输出结果为
支?金?合?

正确结果应该为
支払金額合計

于是使用
System.out.println(URLEncoder.encode("支払金額合計","windows-31j"));

把这几个字符编码了一下,得到的结果是
%8E%78%95%A5%8B%E0%8A%7A%8D%87%8C%76

和上面的比较了一下确实有些不一样
下面几个编码好像变成了字幕
%78   ->x
%7A  ->z
%76  ->z

用下面代码解码一下也确实如此
        System.out.println(URLDecoder.decode("%78","windows-31j"));
        System.out.println(URLDecoder.decode("%7A","windows-31j"));
        System.out.println(URLDecoder.decode("%76","windows-31j"));


但是问题是,为什么浏览器编码时和URLEncoder.encode编码是不一样的呢?为什么Tomcat可以正确的解码呢?
调查了一下才发现Tomcat根本不是用的URLDecoder.decode来解码的,而是用的org.apache.catalina.util.RequestUtil类。
这样解码一下发现都能得到正确的结果
        System.out.println(RequestUtil.URLDecode("%8Ex%95%A5%8B%E0%8Az%8D%87%8Cv","windows-31j"));
        System.out.println(RequestUtil.URLDecode("%8E%78%95%A5%8B%E0%8A%7A%8D%87%8C%76","windows-31j"));


至于为什么,查看一下两个类的源代码就一清二楚了。
至于为什么要这样做,我想是出于减少浏览器和服务器之间的传输数据量的考虑。
分享到:
评论

相关推荐

    详谈java编码互转(application/x-www-form-urlencoded)

    本文将详细讲解 Java 编码互转的相关知识点,包括 URL 编码、URL 解码、application/x-www-form-urlencoded MIME 格式、UTF-8 编码机制、HTML 格式编码等。 URL 编码 Java 中的 URL 编码是通过 URLEncoder 类来...

    ajax中文乱码的各种解决办法总结

    为此,我们需要在发送请求前设置`Content-Type`头部,例如设置为`"application/x-www-form-urlencoded; charset=utf-8"`,确保数据以正确的编码发送。在JavaScript中,可以这样做: ```javascript var xhr = new ...

    java使用URLDecoder和URLEncoder对中文字符进行编码和解码

    相反,`URLDecoder`类提供了`decode`静态方法,用于将`application/x-www-form-urlencoded` MIME格式的字符串解码回原始的普通字符串。解码过程会反转`encode`操作,将百分号序列转换回对应的字符。同样,解码也需要...

    解决了中文乱码的http的get和post请求demo

    在使用HttpURLConnection时,需要设置请求头`Content-Type`为`application/x-www-form-urlencoded;charset=UTF-8`,确保服务器知道数据的编码方式。示例代码如下: ```java URL url = new URL(...

    关于\"form表单提交数据编码方式和tomcat接受数据解码方式的思考\"一文的纠错

    对于`application/x-www-form-urlencoded`类型的数据,Tomcat会尝试使用请求头中的`Charset`来解码数据,如果没有指定,则默认使用ISO-8859-1。对于`multipart/form-data`,每个部分的边界内会有编码信息。 然而,...

    Ajax传输中文乱码问题的解决办法

    1. **设置请求头编码**:在发送Ajax请求时,确保设置Content-Type为`application/x-www-form-urlencoded; charset=UTF-8`,例如: ```javascript j$.ajax({ type: "get", url: "add_form_do.jsp", contentType...

    Spring Cloud使用Feign实现Form表单提交的示例

    通过查看日志,我们可以看到Feign成功地以`Content-Type: application/x-www-form-urlencoded`的形式发送了表单数据,证明了Form表单提交的正确性。 参考官方文档和StackOverflow上的讨论,我们可以了解到更多关于...

    关于Ajax请求中传输中文乱码问题的解决方案

    服务器端在接收到这些编码值后,需要通过`System.Web.HttpUtility.UrlDecode()`函数将其解码回原始的中文字符。 服务器端的处理逻辑如下: 1. 从请求中获取`folderId`、`folderName`和`custId`。 2. 使用`Url...

    解决Python发送Http请求时,中文乱码的问题

    在这个示例中,通过设置`Content-Type`为`application/x-www-form-urlencoded; charset=UTF-8`,指明了请求体的编码方式,使得服务端能够按照正确的字符集解码。 #### 三、补充知识:使用Request Payload翻页获取...

    HttpUtil工具包

    此外,工具包可能还提供了对URL编码和解码的支持,以正确处理特殊字符。 图片处理部分,`HttpUtil`可能包含图片的加载和缓存机制。在Android开发中,这可能涉及到使用像Glide、Picasso或Volley这样的库来下载、缓存...

    基于HttpServletRequest 相关常用方法的应用

    - GET方式的乱码处理:由于GET方式的请求参数包含在URL中,所以需要通过解码后再编码的方式处理乱码,如: ```java String value = request.getParameter("username"); String out = new String(value.getBytes...

    Go-formam-将表单的值解码成一个结构体

    r.Header.Set("Content-Type", "application/x-www-form-urlencoded") user := User{} formam.Decode(r.Form, &user) fmt.Println(user.Name) // 输出: John fmt.Println(user.Email) // 输出: john@example....

    get、post请求中文乱码处理方式一

    - 参数编码:客户端对POST数据进行编码,比如在Java中使用`URLEncoder.encode()`,在JavaScript中使用`new Blob([data], {type: 'application/x-www-form-urlencoded;charset=utf-8'})`。 - 服务器端接收:服务端...

    AJAX技术使用XMLHttpRequest对象传递参数的中文乱码问题

    xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); // 对中文数据进行两次encodeURI编码 xmlhttp.send("name=" + encodeURI(encodeURI("中文"))); ``` 2. **服务器端解码**: ...

    JSP页面中文参数的传递(get和post方法分析).docx

    在 FORM 方式中,我们可以使用 enctype="application/x--form-urlencoded" 来传递中文参数。 例如,假设我们有一个 FORM: ```html <form action="./MyJsp2.jsp" method="post" enctype="application/x--form-...

    JQuery的Ajax中Post方法传递中文出现乱码的解决方法

    在jQuery的`$.ajax`或`$.post`方法中,默认的`contentType`是`application/x-www-form-urlencoded`,但没有指定字符集,这会导致数据以ISO-8859-1编码发送,不支持中文字符。要解决这个问题,我们需要在Ajax请求中...

    JQuery.ajax传递中文参数的解决方法 推荐

    JQuery的默认`contentType`是`application/x-www-form-urlencoded`,在没有明确指定字符集的情况下,它会采用ISO-8859-1(Latin-1)编码,这个编码并不包含完整的中文字符,因此在传输含有中文字符的数据时会出现...

    form:Go的表单编码和解码包

    该库旨在允许以application/x-www-form-urlencoded格式和格式对任意数据进行无缝,高保真编码和解码。 它主要用于处理Web表单和URI查询字符串,这两者都本机采用所述格式。 毫不奇怪, form是在其他Go 包(尤其是...

    jQuery中文乱码

    2. **正确设置Ajax请求头**:在使用jQuery的Ajax方法时,应明确指定`Content-Type`为`application/x-www-form-urlencoded; charset=UTF-8`,以确保传输过程中的字符编码正确。 ```javascript $.ajax({ url: "/...

    C++Http上传文件到web服务器,解决中文参数乱码

    请求头可能包含如Content-Type这样的字段,用于指示请求体的数据类型,例如"application/x-www-form-urlencoded"或"multipart/form-data"。对于文件上传,后者更常见。如果在请求头中没有指定正确的字符集,服务器...

Global site tag (gtag.js) - Google Analytics