java怎么设置utf8

Python016

java怎么设置utf8,第1张

服务器端修改数据库配置文件/etc/my.cnfcharacter-set-server=utf8mb4 collation_server=utf8mb4_unicode_ci重启MySQL(按照官方文档,这两个选项都是可以动态设置的,但是实际的经验是Server必须重启一下)已有的表修改编码为utf8mb4ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;使用下面这个语句只是修改了表的default编码ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4客户端jdbc的连接字符串不支持utf8mb4,这个 这种方式 来解决的,如果服务器端设置了character_set_server=utf8mb4,则客户端会自动将传过去的utf-8视作utf8mb4。Connector/J did not support utf8mb4 for servers 5.5.2 and newer.Connector/J now auto-detects servers configured with character_set_server=utf8mb4 or treats the Java encoding utf-8 passed using characterEncoding=... as utf8mb4 in the SET NAMES= calls it makes when establishing the connection. (Bug #54175)其他的client端,比如php、python需要看下client是否支持,如果不能在连接字符串中指定的话,可以在获取连接之后,执行”set names utf8mb4″来解决这个问题;因为utf8mb4是utf8的超集,理论上即使client修改字符集为utf8mb4,也会不会对已有的utf8编码读取产生任何问题。

主要分response的字节字符输出流和request接受中文参数doGet(),doPost()的设置四种.以及从服务器下载文件到浏览器的编码问题.

都是我学习java时总结的,希望能帮到你.

response的字节输出流:

// 设置浏览器默认打开的时候采用的字符集编码

response.setHeader("Content-Type", "text/htmlcharset=UTF-8")

// 设置中文转成字节数组的时候取出的编码

response.getOutputStream().write("如果不设置编码,这里就是乱码".getBytes("UTF-8"))

response的字符输出流:

//设置浏览器默认打开的时候采用的字符集编码,response的字符流的缓冲区的编码.

response.setContentType("text/htmlcharset=UTF-8")

response.getWriter().println("中文")

request的doGet()编码解决:

String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8")

System.out.println("GET方式:"+name)

request的doPost()编码解决:

request.setCharacterEncoding("UTF-8")

String name = request.getParameter("name")

System.out.println("POST方式:"+name)

下载文件时浏览器编码问题:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// 1.接收参数

String filename = new String(request.getParameter("filename").getBytes("ISO-8859-1"),"UTF-8")

System.out.println(filename)

// 2.完成文件下载:

// 2.1设置Content-Type头(获取文件的mime类型)

String type = this.getServletContext().getMimeType(filename)

//设置文件的mime类型

response.setHeader("Content-Type", type)

// 2.3web项目文件的绝对路径

String realPath = this.getServletContext().getRealPath("/download/"+filename)

// 获得浏览器的类型处理中文文件的乱码问题.(User-Agent:服务器收到客户端版本之类的一些信息)

String agent = request.getHeader("User-Agent")

System.out.println(agent)

if(agent.contains("Firefox")){

filename = base64EncodeFileName(filename)

}else{

//IE谷歌编码

filename = URLEncoder.encode(filename,"UTF-8")

}

// 2.2设置Content-Disposition头(固定写法,让浏览器必须下载,不能直接打开)

response.setHeader("Content-Disposition", "attachmentfilename="+filename)

//获得文件

InputStream is = new FileInputStream(realPath)

// 获得response指定的方法获取输出流:如果用其他流是直接拷贝而不是下载

OutputStream os = response.getOutputStream()

int len = 0

byte[] b = new byte[1024]

while((len = is.read(b))!= -1){

os.write(b, 0, len)

}

//响应流可以不关,在服务器做出相应后服务器会自动把response获得的流关闭

is.close()

}

//火狐

public static String base64EncodeFileName(String fileName) {

BASE64Encoder base64Encoder = new BASE64Encoder()

try {

return "=?UTF-8?B?"

+ new String(base64Encoder.encode(fileName

.getBytes("UTF-8"))) + "?="

} catch (UnsupportedEncodingException e) {

e.printStackTrace()

throw new RuntimeException(e)

}

}