JAVA URL中带有中文时的处理

不同的AppServer如何对URL进行编码实现的原理可能会不同.(Resin和Tomcat肯定会不同)
在Tomcat下至少做到了这四个步骤就可以解决中文编码的问题

(1)确定JSP页面头部是否有:<%@ page contentType="text/html; charset=GBK" %>
(2)用这个转码:
String param= new String(request.getParameter("param").getBytes("ISO-8859-1"), "GBK");
(3)添加filter字符过滤器
(4)如果是通过"a.jsp?param=中文"传递参数,则需要:
a.在传参数之前先把参数进行转码:java.net.URLEncoder.encode(param);
取值用java.net.URLDncoder.decode(param);再转回中文
b.在你的Tomcat目录-->conf目录-->server.xml里找出这段:
<Connector
port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" <!--在里边加上这个参数-->URIEncoding="gb2312"
/>

关键是第4步,添加URIEncoding="gb2312"

在Resin中,修改Resin.conf


<server>
......
<url-character-encoding>utf-8</url-character-encoding>
.......
</server>

因为,Resin decodes the URL before it dispatches to a <web- app> to the <url-character-encoding> needs to be at the <server> level.
Java,如果你需要通过`HttpURLConnection`或者第三方库如Apache HttpClient发送POST请求,并附带二进制文件作为参数,你需要将文件转换成合适的字节流形式。下面是一个基本的例子: ```java import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; // 假设你有一个File对象或者InputStream InputStream inputStream = ...; // 从文件读取或者网络获取 try { // 创建URL对象 URL url = new URL("http://example.com/upload"); // 打开连接并设置POST方法 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); // 设置可以输出数据 // 添加二进制文件头信息 String contentType = "multipart/form-data"; connection.setRequestProperty("Content-Type", contentType + "; boundary=" + generateBoundary()); // 写入分隔符和文件数据 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[4096]; int bytesRead; outputStream.write("--" + generateBoundary() + "\r\n".getBytes()); outputStream.write("Content-Disposition: form-data; name=\"file\"; filename=\"your_file_name\"\r\n".getBytes()); outputStream.write("Content-Type: application/octet-stream\r\n\r\n".getBytes()); while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } outputStream.write("\r\n".getBytes()); // 结束文件数据 outputStream.write("--" + generateBoundary() + "--\r\n".getBytes()); // 将整个内容写入连接 OutputStream os = connection.getOutputStream(); os.write(outputStream.toByteArray()); os.flush(); // 获取响应状态码 int responseCode = connection.getResponseCode(); System.out.println("Response Code : " + responseCode); // 关闭资源 inputStream.close(); os.close(); connection.disconnect(); } catch (Exception e) { e.printStackTrace(); } private String generateBoundary() { return Long.toHexString(Double.doubleToLongBits(Math.random())); } ``` 在这个例子,我们生成了一个随机边界字符串用于分割数据块,并设置了`Content-Disposition`字段描述文件名。注意实际应用可能还需要处理异常和添加错误处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值