Http
Multipart MIME
When a form contains a file input control, the enctype attribute should always be “multipart/form-data”, which specifies that the form will be sent as a multipart MIME message.
POST http://localhost:50460/api/values/1 HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------41184676334
Content-Length: 29278
-----------------------------41184676334
Content-Disposition: form-data; name="caption"
Summer vacation
-----------------------------41184676334
Content-Disposition: form-data; name="image1"; filename="GrandCanyon.jpg"
Content-Type: image/jpeg
(Binary data not shown)
-----------------------------41184676334--
Each message part contains one or more headers, followed by the part contents.
- The
Content-Disposition
header includes the name of the control. For files, it also contains the file name. - The
Content-Type
header describes the data in the part. If this header is omitted, the default is text/plain.
Content-Disposition
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition
200 OK
Content-Type: text/html; charset=utf-8
Content-Disposition: attachment; filename="cool.html"
Content-Length: 22
<HTML>Save me!</HTML>
POST /test.html HTTP/1.1
Host: example.org
Content-Type: multipart/form-data;boundary="boundary"
--boundary
Content-Disposition: form-data; name="field1"
value1
--boundary
Content-Disposition: form-data; name="field2"; filename="example.txt"
value2
--boundary--
Content-Disposition
有两个用途:
- As a response header for the main body, 两个可选值:
inline
orattachment
,inline
指示在浏览器显示、attachment
指示浏览器文件保存到本地, 默认inline
. - As a header for multipart body, 第一个值固定
form-data
, 可选参数name
,filename
,filename*
.
charset
<meta charset="utf-8"/>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
<meta content="text/html;charset=utf-8"/> ##这个写法不行
第一种, 第二种工作; 第三种方式不工作
web页面form标签post提交数据时(使用默认的
application/x-www-form-urlencoded
),input标签中的字符串使用的是什么编码?
- 如果页面没有指定编码方式, 各种浏览器有自己的默认处理策略(见下一问题)
- 如果页面指定了charset, 则输入的字符串会先以指定的encoding编码字符串, 然后再 urlencode 为key-value串,提交服务器
- 如果页面未指定charset,但form标签
accept-charset="utf-8"
指定了form的charset,则字符串会已form指定的 charset encoding
注: System.Web.HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client, 如果录入的数据包含中文,但是指定或默认的是字符集错误(比如为 latin-1), 提交到aspx 上时会触发这个验证异常。
如何查看chrome、firefox、IE当前页面编码?
- dev console,
document.charset
显示当前编码- firefox 显示页面详细信息也可以通过 地址栏左边的信息按钮 -> more information -> General
https://developer.mozilla.org/en-US/docs/Web/API/Document/characterSet
The Document.characterSet read-only property returns the character encoding of the current document. The character encoding is the character set used for rendering the document, which may be different from the encoding specified by the page. (The user can override the encoding.).
如果不设置页面编码, 浏览器以什么编码解析页面?经测试,结果如下:
- chrome,firefox ->
windows-1252
- IE ->
gb2312
什么是 ‘windows-1252’ 编码? ISO-8859-1 vs Windows-1252.
https://blog.csdn.net/J080624/article/details/55267967
ISO-8859-1,正式编号为ISO/IEC 8859-1:1998,又称 Latin-1 或“西欧语言”,是国际标准化组织内ISO/IEC 8859的第一个8位字符集。
它以ASCII为基础,在空置的0xA0-0xFF的范围内,加入96个字母及符号,藉以供使用附加符号的拉丁字母语言使用。Unicode的前0-255个字符与ISO-8859-1相一致。
Windows-1252经常被错误地贴上ISO-8859-1的标签,因为它们十分相似。
除了128到159(十六进制80到9F)范围内的很少使用的C1控制字符被替换为额外的字符外,Windows-1252代码页的字符和ISO-8859-1完全一致。Windows-28591代码页才是真正的ISO-8859-1,然而,英文版的Windows 7、Windows10家庭中文版 系统上没有Windows-28591代码页,至于其他系统有没有我就不知道了。
Windows10家庭中文版 上会将ISO8859-1 翻译为Windows-1252。
所以, 基本可以简单认为 windows-1252 是 Latin-1.
windows-1252
有什么坑?
https://blog.csdn.net/zou8944/article/details/79859112,Windows-1252字符集(MS1252)造成的困扰。 没碰到过,搜索时看到的文章,有点意思,参考。
浏览器URL编码
参考: 不同浏览器中URL的编码方式(https://blog.csdn.net/u014785687/article/details/74078512)
总结: 有一个地方注意,无指定页面编码情况下: pathinfo部分几家基本都默认 utf-8编码, queryString 部分,IE默认采用的GB 2312, Firefox、Chrome 默认采用 utf-8.