架构相关:全方位解析web产品中的编码问题
2016-09-25 23:09
405 查看
互联网的的实质大致可以归结为数据之间的交互,而交互就不得不涉及到数据的编码解码转吗等等一些问题。
而在实际工作中发现很多开发同事对这些并没有一个清晰完整的认识,这里就我目前为止接触的产品编码相关做一下全方位的总结。
这里按照用户输入url打开网页这一场景的顺序进行解析:
这就会导致一个问题,如果在一个默认编码不是utf-8的系统下输入url,且参数中有中文,这是server端解析参数就会出现问题。但是一般是不需要用户手动输入url参数的,这个问题可以忽略。如果在页面中用js或<a>标签打开一个url,它的编码会按照该页面的编码设置,也不会存在这个问题。
如果不进行对整个页面的编码设置能否保证url的编码正确呢?这个当然是可以的。
js使用 encodeURI()方法后,url中的某些字符将被十六进制的转义序列进行替换,这个替换的本质是二进制数据的操作,这样最后得出的字符串自然就保留了替换时的编码方式。server端会自动识别%符号进行解码。接下来我们到了第二步。
tomcat是修改server.xml文件,
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />
这样在容器解析url的时候使用utf-8的编码方式。
大家肯定见过 request.setCharacterEncoding("UTF-8"); 这一方法,但它和上面的区别是它只能控制程序中POST方法提交的参数的解码方式,且它只能在参数被访问之前设置,访问后设置无效,因为容器会自动读取默认编码对参数进行解析。这么看最根本的方法还是将默认编码统一掉。
<metahttp-equiv="Content-Type"content="text/html; charset=utf-8"/>
标签就可以对浏览器读取该文件的编码方式进行设置,当然如果是在这个标签之前的内容浏览器会使用默认编码,因为一般头部都是一些纯英文字符,即使用GBK编码读取也是没有问题的。该页面包含的所有js、css文件也都会按照html文件的编码方式解析。
这个规则无论是对jsp、php、ejs、还是jsx都是有效的:p
当然其中在server端运行的部分还是根据server的默认解码进行,比如开发过程中IDE会设置默认编码,解释器自然会根据默认编码对代码进行解析。比如java将字符串转为unicode。
而在实际工作中发现很多开发同事对这些并没有一个清晰完整的认识,这里就我目前为止接触的产品编码相关做一下全方位的总结。
这里按照用户输入url打开网页这一场景的顺序进行解析:
1、当在浏览器输入url的时候在浏览器端发生了什么?
url默认使用utf-8,url后带参数的编码方面有一个默认编码的概念,大部分情况下系统默认编码是utf-8,浏览器也会按照系统默认编码对url后带的参数进行编码。这就会导致一个问题,如果在一个默认编码不是utf-8的系统下输入url,且参数中有中文,这是server端解析参数就会出现问题。但是一般是不需要用户手动输入url参数的,这个问题可以忽略。如果在页面中用js或<a>标签打开一个url,它的编码会按照该页面的编码设置,也不会存在这个问题。
如果不进行对整个页面的编码设置能否保证url的编码正确呢?这个当然是可以的。
js使用 encodeURI()方法后,url中的某些字符将被十六进制的转义序列进行替换,这个替换的本质是二进制数据的操作,这样最后得出的字符串自然就保留了替换时的编码方式。server端会自动识别%符号进行解码。接下来我们到了第二步。
2、在server接收到字符串的时候发生了什么?
上面提到了,当server端发现url数据流中包含%符号的时候会自动将数据流解码成二进制数据流,这之后还需要一个过程才能得到我们的中文字符,那就是用默认编码进行解码,很多时候是utf-8,但很多都不是,所以需要对server进行进行设置。tomcat是修改server.xml文件,
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />
这样在容器解析url的时候使用utf-8的编码方式。
大家肯定见过 request.setCharacterEncoding("UTF-8"); 这一方法,但它和上面的区别是它只能控制程序中POST方法提交的参数的解码方式,且它只能在参数被访问之前设置,访问后设置无效,因为容器会自动读取默认编码对参数进行解析。这么看最根本的方法还是将默认编码统一掉。
3、页面上是如何设置编码方式的?
html是在浏览器端解析的,所以只要在文件头部加<metahttp-equiv="Content-Type"content="text/html; charset=utf-8"/>
标签就可以对浏览器读取该文件的编码方式进行设置,当然如果是在这个标签之前的内容浏览器会使用默认编码,因为一般头部都是一些纯英文字符,即使用GBK编码读取也是没有问题的。该页面包含的所有js、css文件也都会按照html文件的编码方式解析。
这个规则无论是对jsp、php、ejs、还是jsx都是有效的:p
当然其中在server端运行的部分还是根据server的默认解码进行,比如开发过程中IDE会设置默认编码,解释器自然会根据默认编码对代码进行解析。比如java将字符串转为unicode。
4、数据库编码方式的的设置
这个比较简单,基本上所有种类的数据库管理软件都可以进行选择设置。相关文章推荐
- 用户刷新页面的重复提交数据问题及WEB-INF文件夹相关解析
- Java web中编码问题解析
- 【《深入解析Java Web技术内幕》学习思维导图】第3章 深入分析Java Web中的中文编码问题
- Java及相关字符集编码问题研究
- Java及相关字符集编码问题研究2
- Suse Linux平台下XML4c解析库支持GB2312编码问题解决过程
- 经典:Java及相关字符集编码问题研究
- Java相关编码问题
- 经典:Java及相关字符集编码问题研究
- 经典:Java及相关字符集编码问题研究
- Java及相关字符集编码问题研究1
- MySQL数据库编码问题全面解析
- Java多语言编码问题解析(1)
- Java及相关字符集编码问题研究
- 关于J2EE下的web项目的架构问题方面的思考
- web应用中涉及到的编码问题总结
- [学习]汉字编码及相关问题
- dom4j解析XML时no protocol:编码问题。
- 经典:Java及相关字符集编码问题研究
- MySQL数据库编码问题全面解析