javaweb常见编码类型以及使用场景
参考深入分析javaweb技术内幕第三章
常见编码类型
1,ASCII码:
单字节编码,共128字符,用1个字节的低七位表示,0-31是控制字符如换行,回车,删除等,32-126是打印字符,可以通过键盘输入并且能够显示出来
2,ISO-8859-1
在ASCII码基础上扩展的编码,包括ISO-8859-1到ISO-8859-15,其中ISO-8859-1涵盖了大多数西欧字符,所以应用的最广泛。单字节编码,共256个字符
3,GB2312
全称“信息技术中文编码字符集”,双字节编码,编码范围A1-F7,其中A1-A9是符号区,总共包含682个符号;B0-B7是汉字区,包含6763个字汉
4,GBK
全称“汉字内码扩展规范”,为了扩展GB2312而出现,编码范围是8140-FEFE(去掉XX7F),总共有23940个码位,能表示31003个汉字;兼容GB2312,可以用GBK解码GB2312的汉字
5,GB18030
全称是“信息技术 中文编码字符集”,是我国的强制标准,它可能是单字节,双字节或者四字节编码,它的编码与GB2312兼容,实际应用中不广泛
6,UTF-16
用两个字节来表示Unicode的转化格式,采用定长的表示方法,16bit,所以叫UTF-16,每两个字节表示一个字符,大大简化了字符串操作,所以这也是JAVA以UTF-16作为内存的字符存储格式的重要原因
7,UTF-8
UTF-8采用变长的表示方法。每个编码区有不同的字码长度,不同类型的字符可以由1-6个字节组成。
如果是1字节,最高位(第8位)是0,则表示这个是1个ASCII字符(00-7F)
如果是一个字节,以11开头,表示这个是一个双字节的字符,这个是它的首字节
如果是一个字节,以10开头,表示这个是一个双字节的字符,这个是它的末字节,要向前查找,才能得到当前字符的首字节。
对于双字节的编码:由于不同处理器对2字节的处理方式不同,有Big-endian(高位字节在前,低位字节在后),或little-endian(低位字节在前,高位字节在后)编码(大端模式and小端模式),所以前面有两个字节用来保持BYTE_ORDER_MARK值
UTF-8 VS UTF16:
UTF-16用顺序编码,不能对单个字符的编码值进行校验,如果一个字符码值损坏,后面的所有码值都将受到影响。编码效率高,但是浪费存储空间,适合本地使用
UTF-8 适合网络传输,效率介于GBK和UTF-16之间,是理想的中文编码方式。
在javaWeb中需要编码的场景
URL的编解码
http://localhost:8080/examples/servlets/servlet/名字?author=我
例子 | 对应的概念 |
---|---|
http | scheme |
localhost | Domain |
8080 | port |
examples | ContextPath |
servlets/servlet | ServletPath |
名字 | PathInfo |
author=我 | QueryString |
其中pathInfo和queryString需要分别进行编解码操作(可能是不一样的编码)
默认的iso-8859-1,所以在URL中,要尽量避免使用费非ASCII的字符,不然不是乱码就是配起来麻烦
具体配置方法参考javaweb技术内幕P78
HTTP Header的编解码
默认是ISO-8859-1,而且不能设置,所以header中要注意一定不能出现非ASCII字符,不然可能会乱码
如果一定要传递非ASCII的字符,可以将字符先用org.apache.catalina.util.URLEnconder编码,再添加到Header中,这样浏览器传递的时候就不会丢失信息了,在要访问的时候再按照相应的字符集解码即可
POST表单的编解码
通过header contentType的Charset编码格式对表单参数进行的编码,然后提交到服务端,服务端同样用contentType中的字符集进行解码。所以一般不会出现问题
要注意,一定要在request.getParameter之前进行request.setCharacterEncoding(charset)设置,如果没有设置就解析,还是会走默认的iso-8859-1
HTTP Body的编解码
在response.setCharacterEncoding中设置返回的编解码字符集,会覆盖request.setCharacterEncoding中设置的值,并且通过header的Content-Type返回给客户端, 如果http header中的Content-Type没有设置charset,那么浏览器将根据html的
- 常见的数据分析图表类型以及各自的使用场景!
- Mysql的各种时间类型的区别以及使用场景
- git常用的指令以及常见的使用场景
- php各种编码集详解和以及在什么情况下进行使用 发布:mdxy-dxy 字体:[增加 减小] 类型:转载 字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。 字符集是多个字符的集
- iOS对于copy的原理以及常见的使用场景
- Java中的引用类型分类以及使用场景
- Android中进程间通讯常见的几种方式以及使用场景
- 浅谈java使用指定字符集编码,以及常见的字符集
- 为什么使用Redis 使用Redis有什么缺点 单线程的Redis为什么这么快 Redis的数据类型,以及每种数据类型的使用场景 Redis的过期策略以
- RUNTIME简介以及常见的使用场景(比较全面)
- 常见图像格式类型区别及使用说明&绝对路径和相对路径的使用场景&css3实现loading效果
- 转载: asp.net ajax UpdatePanel使用技巧以及常见问题
- Hadoop使用常见问题以及解决方法
- WCF 第六章 编码与序列化 使用NetDataContractSerializer共享类型
- Hadoop使用常见问题以及解决方法5
- oracle中使用系统用户创建用户以及常见oracle命令
- Unity(四):使用场景Ⅰ:建立类型映射
- Hadoop使用常见问题以及解决方法
- 在使用PostgreSql数据库时常见的,有关访问权限以及远程连接数据库的问题,及其解决办法。...
- 5.3.1 使用接口更改已装箱值类型中的字段(以及为什么不应该这样做)