这篇文章算是对我前几年在做搜索引擎项目时候无法解决的一个问题画一个句号吧,用处不大,不过可以弥补下自己的一个遗憾。
当时的场景是这样子的,本来正常人的习惯总是在搜索框输入正常搜索词然后进行搜索,但是总有一些用户会自认为聪明的,从地址栏复制出URL,然后改parameter然后进行访问,类似于http://www.xxx.com/search?keyword =%E4%B8%AD%E6%96%87 (IE下的显示,至于chrome和firefox等则会在地址栏显示中文),当用户提交的请求在IE下是http://www.xxx.com/search?keyword =中文 时,你会发现服务端(web处理后端)根本无法识别这种字符,这是浏览器在向后端提交请求的时候,其参数必须是iso-8859-1规范的URLEncode,在写web程序的时候,IE必须要我们手动去转换编码,而chrome和firefox则可转可不转,因为它们会在传输的时候自动转换。
后端无法识别字符,也就是我们常说的乱码。这种乱码产生的原因也是因为解码错误,我们的web容器(框架 、类似于java中的jetty/tomcat/jboss和python中的django之类的)会自动把这串字符进行UrlDecode.此时,IE提交的没有经过编码的字符被解码,那可想而知,再也回不来了(多少人曾经像我一样看到这种乱码,病急乱投医)。
ok,解决这种问题的方案其实有两种,第一种是在到达web后端之前(没办法在js层,因为用户是直接敲地址栏的回车的),也就是说是在服务端的前端(nginx)进行预处理,将没有编码的字符进行