multipart/form-data 当提交表单时,如何指定字符集

jmcooler 2014-06-15 03:34:31
<Form method="POST" enctype="multipart/form-data" accept-charset="utf-8" >
此时,浏览器将隐含以 UTF-8 编码,并提交表单中的键值对。
所谓“隐含”,就是不会在各个 Part 中显示指明 Content-Type: text/plian, charset=utf-8

发出去的内容如下:
Accept-Encoding: gzip,deflate,sdch
Content-Type: multipart/form-data; boundary=boudary

--boudary
Content-Disposition: form-data; name="bobi" //表单键值对

utf-8 编码的文字串
--boudary
Content-Disposition: form-data; name="file" filename="太阳花.jpg"

二进制数据
--boudary--

但是,当表单中如果没有指定 accept-charset="utf-8" 时,对于爬虫程序,就不知道该怎么编码字符串,并提交表单了
其一,我如果按 GB2312 作为默认编码,发中国的网站还好,发国外的网站,人家就不认识
其二、我如果按 utf-8 作为字符串编码,那么我要在上面哪个行位置上告诉服务器我用的是 UTF-8 编码的呢?难道是这里:
Content-Disposition: form-data; name="bobi"
Content-Type: text/plain; charset=utf-8
这样写行不行啊?
...全文
3440 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
shine333 2014-06-16
  • 打赏
  • 举报
回复
引用 2 楼 jmcooler 的回复:
需要指出的是,如果 Form 不指定 accept-charset="utf-8" 时,各种浏览器,将默认以 GB2312 编码文本数据,且并不会显示告知服务器用了这个字符集 这会出现问题的。当我往国外网站,提交一段中文文字,而该网站并未在表单里,指定可接受的字符集时,发出去肯定是乱码。 互联网,难道不可以规范一下,当表单不指定字符集时,全都默认采用 utf-8 就好啦。
楼主谁告诉你各种浏览器默认GB2312了 另外,你现在的爬虫用的是什么类库,主要爬的网站又是哪些?
引用 1 楼 jmcooler 的回复:
另外,其中有个 filename="太阳花.jpg" 这里出现了中文,也需要被编码,又该怎么办呢?
文件名有多种编码格式,但是各种浏览器支持的种类不一。不过你是爬虫,理论上服务器应该都支持。 filename=*UTF8''%E5%A4%AA%E9%98%B3%E8%8A%B1.jpg http://stackoverflow.com/questions/93551/how-to-encode-the-filename-parameter-of-content-disposition-header-in-http
tony4geek 2014-06-16
  • 打赏
  • 举报
回复
你加上, <%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
Defonds 2014-06-15
  • 打赏
  • 举报
回复
表单头加上:
<form method="post" enctype="multipart/form-data" acceptcharset="UTF-8" > 
然后使用以下参数启动 jvm:
-Dfile.encoding=UTF-8
Defonds 2014-06-15
  • 打赏
  • 举报
回复
http client 请求? 你这样试试:
Request.setHeader(CoreProtocolPNames.HTTP_CONTENT_CHARSET, Consts.UTF_8);
或者这个:
Request.Post("someurl")
        .useExpectContinue()
        .version(HttpVersion.HTTP_1_1)
        .bodyString("Important stuff", ContentType.create("text/plain", Consts.UTF_8))
        .execute()
        .returnContent().asBytes();
jmcooler 2014-06-15
  • 打赏
  • 举报
回复
我说的,主要是桌面爬虫程序,或者自动提交表单的客户端程序 而非Web服务器如何配置 UTF-8
jmcooler 2014-06-15
  • 打赏
  • 举报
回复
需要指出的是,如果 Form 不指定 accept-charset="utf-8" 时,各种浏览器,将默认以 GB2312 编码文本数据,且并不会显示告知服务器用了这个字符集 这会出现问题的。当我往国外网站,提交一段中文文字,而该网站并未在表单里,指定可接受的字符集时,发出去肯定是乱码。 互联网,难道不可以规范一下,当表单不指定字符集时,全都默认采用 utf-8 就好啦。
jmcooler 2014-06-15
  • 打赏
  • 举报
回复
另外,其中有个 filename="太阳花.jpg" 这里出现了中文,也需要被编码,又该怎么办呢?
如果在表单中使用表单元素 ,浏览器在解析表单,会自动生成一个输入框和一个按钮,输入框可供用户填写本地文件的文件名和路径名,按钮可以让浏览器打开一个文件选择框供用户选择文件: 当表单需要上传文件,需指定表单 enctype 的值为 multipart/form-data 在 form 元素的语法中,enctype 属性指定将数据发送到服务器浏览器使用的编码类型。 enctype 属性取值: application/x-www-form-urlencoded:表单 enctype 属性的默认值。这种编码方案使用有限的字符集,当使用了非字母和数字,必须用”%HH”代替(H 代表十六进制数字)。对于大容量的二进制数据或包含非 ASCII 字符的文本来说,这种编码不能满足要求。 multipart/form-data:form 设定了enctype=“multipart/form-data”属性后,表示表单以二进制传输数据 . Commons-fileupload 组件上传的基本原理 FileUpload组件将页面提交的所有元素(普通form表单域,如text和文件域file)都看作一样的FileItem,这样上传页面提交的 request请求也就是一个FileItem的有序组合,FileUpload组件可以解析该request,并返回一个一个的FileItem。而对每一个FileItem,FileUpload组件可以判断出它是普通form表单域还是文件file域,从而根据不同的类型,采取不同的操作--如果是表单域,就读出其值,如果是文件域,就保存文件到服务器硬盘上或者内存中

81,117

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧