您的位置:首页 > 理论基础 > 计算机网络

ajax发送中文与http的post,get的不同

2011-08-19 14:34 295 查看
最近在项目开发过程中遇到了一个前端直接ajax post,或者get中文,后台无论怎么转码也取不到中文的问题,今天参考了一下资料,

并做了实验,发现问题如下:

对于中文,iso-8859-1的encode是不能被还原的,以“中文”为例一下的几个编码对应的byte数组为:

[-28, -72, -83, -26, -106, -121] UTF-8

[-42, -48, -50, -60] GBK

[63, 63] iso-8859-1

从上可见,utf-8 是三个字节存储一个汉字,GBK为两个,而iso-8859-1的encode是不可逆转的,其实任何汉字经过Iso-8859-1的encode都会成为63,这是因为iso-8859-1中没有中文,所以"中"的值被替换成63,显示'?',无法判断以前是什么值。

而在ajax进行get或者post请求的时候,避开了url的encode,这个form的不同:

浏览器会以iso-8859-1的方式进行编码,这个过程对中文数据造成了损坏,所以无论后端怎么解码都是错误的,因为得到的byte流都是63,所以需要这里先编一次码,之后传输即可,或者直接传输UTF-8 的码:

str3:"%E4%B8%AD%E6%96%87",str2:encodeURI("中文")

然后后台先取到这个码制,在对其进行反编译即可;

而用form的方式进行get 或者post的时候:

Get:

第一:需要URL encode的字符一般都是非ASCII的字符(笼统的讲),再通俗的讲就是除了英文字母以外的文字(如:中文,日文等)都要进行URL encode,所以对于我们来说,都是英文字母的url不会出现服务器得到乱码问题,出现乱码都是url里面带了中文或特殊字符造成的;

第二:URL encode到底按照那种编码方式对字符编码?这里就是浏览器的事情了,而且不同的浏览器有不同的做法,中文版的浏览器一般会默认的使用GBK,通过设置浏览器也可以使用UTF-8,可能不同的用户就有不同的浏览器设置,也就造成不同的编码方式,所以很多网站的做法都是先把url里面的中文或特殊字符用 javascript做URL encode,然后再拼接url提交数据,也就是替浏览器做了URL encode,好处就是网站可以统一get方法提交数据的编码方式。这里urlencode对于request的编码方式为:

URLs can only be sent over the Internet using the
ASCII character-set.

Since URLs often contain characters outside the ASCII set, the URL has to be converted into a valid ASCII format.

URL encoding replaces unsafe ASCII characters with a "%" followed by two hexadecimal digits.

http://www.w3schools.com/tags/ref_urlencode.asp

在get的方式之下,url将中文改成了 %E4%B8%AD%E6%96%87 ,然后再在网络传输中设置成1010101010.。。。

POST:

对于post是否会经过url encode呢?

When data that has been entered into HTML forms is submitted, the form field names and values are encoded and sent to the server in an HTTP request message using method

GET or
POST, or, historically, via
email.[2] The encoding used by default is based on a very early version of the general URI percent-encoding rules, with a number of modifications such as
newline normalization and replacing spaces with "+" instead of "%20".

http://en.wikipedia.org/wiki/Percent-encoding

也就是默认的来说,对于未指定编码类型的情况下,都会默认的使用MIME TYPE(是经过 ietf 组织协商,以 RFC 的形式作为建议的标准发布在网上的统一的规则类型)

在form的情况下,post和get在统一的url encode之后,再进行iso-8859-1的编码,这样就可以避免有中文的存在了。

由此可见,ajax的传参,和http的get post,在编码上,有些小小的不同,这就使得后端针对不同的请求,要做不同的处理了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: