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

本质上来说,java.net.UrlEncoder适用于将 String 转换为 application/x-www-form-urlencoded MIME 格式的静态方法 时 ,使用

但!一般情况下,web应用中,当你的服务器,页面编码,请求时编码都已经修改为 utf-8后,依然乱码时,此时则应试着用下方所写到的方法

使用URLDecoder将所乱码的数据进行解码,

而在此处简单说一下乱码的场景和简单转换时的执行原理:

首先,form表单提示数据时,默认Content-type:为 application/x-www-form-urlencoded,

当然也可以是:multipart/form-data ,multipart/form-data 一般用做form表单以流的形式提交数据时,则设置,enctype为该form-data形式,

不过呢,一般情况下,本宝宝桑面 提到了,提交方式为application/x-www-form-urlencoded, 当 环境等等都已经配置为统一编码后,仍然出现汉字

传到后台 被解码处理的情况时(也就是所谓的乱码 ),此时可以尝试,该文下面所提到的方法,使用URLDecoder进行解码再转换,然后转换为汉字,

当然在使用场景上,其实还是有很多情况下需要区分的,当然 也是必须严格按照 格式 来做相对应的处理也才是最正确的方法,目前有些事情需要处理一下

先到这里喽,^_^ bye

java  使用URLDecoder和URLEncoder对中文进行处理

一 URLEncoder

HTML 格式编码的实用工具类。该类包含了将 String 转换为 application/x-www-form-urlencoded MIME 格式的静态方法。有关 HTML 格式编码的更多信息,请参阅 HTML 规范。

对 String 编码时,使用以下规则:

字母数字字符 "a" 到 "z"、"A" 到 "Z" 和 "0" 到 "9" 保持不变。

特殊字符 "."、"-"、"*" 和 "_" 保持不变。

空格字符 " " 转换为一个加号 "+"。

所有其他字符都是不安全的,因此首先使用一些编码机制将它们转换为一个或多个字节。然后每个字节用一个包含 3 个字符的字符串 "%xy" 表示,其中 xy 为该字节的两位十六进制表示形式。推荐的编码机制是 UTF-8。但是,出于兼容性考虑,如果未指定一种编码,则使用相应平台的默认编码。

例如,使用 UTF-8 编码机制,字符串 "The string ü@foo-bar" 将转换为 "The+string+%C3%BC%40foo-bar",因为在 UTF-8 中,字符 ü 编码为两个字节,C3 (十六进制)和 BC (十六进制),字符 @ 编码为一个字节 40 (十六进制)。

 二 URLDecoder

该类包含了将 String 从 application/x-www-form-urlencoded MIME 格式解码的静态方法。

该转换过程正好与 URLEncoder 类使用的过程相反。假定已编码的字符串中的所有字符为下列之一:"a" 到 "z"、"A" 到 "Z"、"0" 到 "9" 和 "-"、"_"、"." 以及 "*"。允许有 "%" 字符,但是将它解释为特殊转义序列的开始。

转换中使用以下规则:

字母数字字符 "a" 到 "z"、"A" 到 "Z" 和 "0" 到 "9" 保持不变。

特殊字符 "."、"-"、"*" 和 "_" 保持不变。

加号 "+" 转换为空格字符 " "。

将把 "%xy" 格式序列视为一个字节,其中 xy 为 8 位的两位十六进制表示形式。然后,所有连续包含一个或多个这些字节序列的子字符串,将被其编码可生成这些连续字节的字符所代替。可以指定对这些字符进行解码的编码机制,或者如果未指定的话,则使用平台的默认编码机制。

该解码器处理非法字符串有两种可能的方法。一种方法是不管该非法字符,另一种方法是抛出 IllegalArgumentException 异常

以上这篇详谈java编码互转(application/x-www-form-urlencoded)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

时间: 2017-07-24

浅析application/x-www-form-urlencoded和multipart/form-data的区别

在Form元素的语法中,EncType表明提交数据的格式 用 Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型. 下边是说明: application/x-www-form-urlencoded : 窗体数据被编码为名称/值对.这是标准的编码格式. multipart/form-data : 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分. text/plain : 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符. 补充 form的enctype属性为编码

jquery.form.js实现将form提交转为ajax方式提交的方法

本文实例讲述了jquery.form.js实现将form提交转为ajax方式提交的方法.分享给大家供大家参考.具体分析如下: 这个框架集合form提交.验证.上传的功能. 这个框架必须和jquery完整版结合,否则使用min则无效. 原理:利用js进行对form进行组装成ajax的url和data,原理还是用ajax来提交,其实这完全可以自己写,但是有这个框架可能会更简单. 一.最简单例子: 第一步:引用js <!--这里的min是自己用js压缩工具对完整版进行的压缩 并不是真正的min,所以好

在django中form的label和verbose name的区别说明

如下所示: captcha = CaptchaField(label = u'验证码') captcha = CaptchaField(verbose_name = u'验证码') label是这个Field如果在form中的话会显示. verbose_name 在form中不会显示 只是一种说明而已 补充知识:django models verbose_name 的作用 一. verbose_name就是在后台显示对对应的名称,看图 对应后台字段如图 以上这篇在django中form的labe

浅析C语言中printf(),sprintf(),scanf(),sscanf()的用法和区别

printf语法: #include <stdio.h>int printf( const char *format, ... ); printf()函数根据format(格式)给出的格式打印输出到STDOUT(标准输出)和其它参数中.返回值是输出的字符数量.sprintf语法: #include <stdio.h>int sprintf( char *buffer, const char *format, ... );sprintf()函数和printf()类似,格式控制完全一样

浅析js中2个等号与3个等号的区别

首先,== equality 等同,=== identity 恒等. ==, 两边值类型不同的时候,要先进行类型转换,再比较. ===,不做类型转换,类型不同的一定不等. 下面分别说明: 先说 ===,这个比较简单.下面的规则用来判断两个值是否===相等: 1.如果类型不同,就[不相等] 2.如果两个都是数值,并且是同一个值,那么[相等]:(!例外)的是,如果其中至少一个是NaN,那么[不相等].(判断一个值是否是NaN,只能用isNaN()来判断) 3.如果两个都是字符串,每个位置的字符都一样

浅析php中三个等号(===)和两个等号(==)的区别

先举个列子:比如你一个函数会返回这几种情况:1.大于0的数2.小于0的数3.等于0的数(也就是0啦)4.False(失败时)这时候如果你想捕获失败的情况,你就必须用===,而不能用==因为==除了会匹配第4种情况外,还会匹配第3种情况,因为0也是假! 三个等号代表比较对象的类型也要一致.两个等号表示只要值相等就满足条件. 再来补充一些:$a='2';//字符型2$b=2;//数值型2$a==$b,是对的,都是2$a===$b,是不对的,因为$a是字符型$b是数值型,值虽一样,但类型不一样.还有就

浅析Python 3 字符串中的 STR 和 Bytes 有什么区别

Python2的字符串有两种:str和Unicode,Python3的字符串也有两种:str和Bytes.Python2的str相当于Python3的Bytes,而Unicode相当于Python3的Bytes. Python2里面的str和Unicode是可以混用的,在都是英文字母的时候str和unicode没有区别. 而Python3严格区分文本(str)和二进制数据(Bytes),文本总是Unicode,用str类型,二进制数据则用Bytes类型表示,这样严格的限制也让我们对如何使用它们有

js动态在form上插入enctype=multipart/form-data的问题

我们都知道要让form能提交文件,需要在form上指定enctype=multipart/form-data的attribute,这样才能上传文件,关于enctype的文章很多,就不再做解释. 问题是因为使用了MVC的Html.BeginForm()来输出表单代码,默认是没有加入enctype的, 复制代码 代码如下: @using (Html.BeginForm()) { } 在PartialView中有一个<input type="file" />用来上传文件,又不想为

jquery动态改变form属性提交表单

有些情况下,同一个form在不同的情况下提交到不同的处理动作,可以在js中动态改变form的属性,满足不同条件的form提交需求. 如: 复制代码 代码如下: <form id="form" name="form" method="POST" enctype="multipart/form-data" action="action1.jsp" target="iframe">

使用jQuery.form.js/springmvc框架实现文件上传功能

使用的技术有jquery.form.js框架, 以及springmvc框架.主要实现异步文件上传的同时封装对象,以及一些注意事项. 功能本身是很简单的,但是涉及到一些传递参数类型的问题.例如:jquery的ajax方法与jquery.form.js中的ajaxSubmit方法的参数,具体细节将在下一篇博客中分享. 重点: html表格三要素: action="fileUpload/fileUpload" method="post" enctype="mul