文档章节

java 常见中文乱码问题解决

祁猛
 祁猛
发布于 2016/11/07 16:06
字数 1037
阅读 85
收藏 0

关于中文乱码:

一、

1).在jsp页面上输入中文,要保证中文不乱码,有三个前提:

保证contentType=“text/html;charset=UTF-8”,pageEncoding=“UTF-8” charset和pageEncoding的编码一致,且都支持中文,通常建议取值为UTF-8,还需要摆正浏览器的显示的字符编码也和请求的jsp页面的编码一致。

2)、常见问题实例:(比如两个jsp,b.jsp获取a.jsp页面传过来的参数值,method为POST)

a.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>中文乱码</title>
</head>
<body>
	<form action="hello.jsp" method="post">
		userName:<input type="text" name="userName"/>
		<input type="submit" value="Submit"/>
	</form>
</body>
</html>
b.jsp

<!--将请求的编码设置成UTF-8可以解决post的问题,但必须在获取请求参数之前设置编码 -->
    <%
		request.setCharacterEncoding("UTF-8");
	%>
<%= request.getParameter("userName")%>

获取中文参数值:默认参数在传输过程中使用的编码为ISO-8859-1.

上面方法对get请求无效,在get请求得按下面方式解码转码:

<%
	String val = request.getParameter("userName");
	String userName = new String(val.getBytes("ISO-8859-1"),"UTF-8");
	out.print(userName+"==");
%>

上面方式比较复杂,有种方式可以既适用于get请求又适用于post请求,修改tomcat参数,中文乱码是tomcat的 问题:

首先修改本地tomcat服务器/conf/server.xml中的:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI="true"/>

<!-- 加一句useBodyEncodingForURI="true"-->

 

不要忘了在exclipse中也改一下tomcat的映射配置文件server.xml,useBodyEncodingForURI这个属性的意思是使用body里指定的字符编码,比URIEncoding要灵活一点,比如body已经指定了UTF-8,那么上面解码转码的方式还会是乱码,因为这个属性已经指定了字符集utf-8,解码也必须utf-8.

二、解析txt文档乱码。

    windows下的文本文件字符集默认是GBK2312/GBK,在使用字符流或字节流读取文本文件的时候,文本文件可能是不同的字符集,比如有ANSI、GBK、UTF-8、Unicode等等,要想读入的数据不乱码,一点要保证读流传入的字符集和文本文件的字符集一致,这样不论文本文件的字符集是什么都可以防止乱码,所以要获取文本文件的字符集,比较专业一点的方法可以去找一下文件探测器,下面介绍一个比较实用的实例:

 

package com.hnasys.fft.web.component.file.analyze;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.util.LinkedList;
import java.util.List;


import com.hnasys.fft.tool.land.Reflects;

public class TabFileAnalyzer {

	public static String codeString(File fileName) throws Exception{
		@SuppressWarnings("resource")
		BufferedInputStream bin = new BufferedInputStream(new FileInputStream(fileName));
		int p = (bin.read() << 8) + bin.read();
		String code = null;
		switch (p) {
			case 0xefbb:
				code = "UTF-8";
				break;
			case 0xfffe:
				code = "Unicode";
				break;
			case 0xfeff:
				code = "UTF-16BE";
				break;
			case 0x5c75:
				code = "ANSI|ASCII" ;
				break ;
			default:
				code = "GBK";
		}
		return code;
	}
	public static <T> void analyze(File file, List<T> datas, Class<T> beanClass) {
		BufferedReader br = null;
		List<String> lines = new LinkedList<String>();
		try {
			try {
                   //读流时传入所读的文本文件的字符集,这样就可以保持传入的文本文件的字符编码可读入时候所用编码一致
				br = new BufferedReader(new InputStreamReader(new FileInputStream(file), codeString(file)));
			} catch (Exception e) {
				e.printStackTrace();
			}
			String line = "";
			while ((line = br.readLine()) != null) {
				if (!line.trim().isEmpty()) {
					lines.add(line + " ");
				}
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				br.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		for (String line : lines) {
			T obj = null;
			try {
				obj = beanClass.newInstance();
			} catch (InstantiationException e) {
				throw new RuntimeException("创建对象失败", e);
			} catch (IllegalAccessException e) {
				throw new RuntimeException("创建对象失败", e);
			}
			String[] lineCols = line.split("\t");
			List<Field> fields = Reflects.getFields(beanClass);
			for (Field field : fields) {
				String value = lineCols[fields.indexOf(field)];
				if (value == null)
					continue;
				value = value.trim();
				if ("N/A".equals(value) || value.isEmpty())
					continue;
				// 实际类型字段值
				Object rv = null;
				// 设置到对象中
				if (field.getType() == String.class)
					rv = value;
				else if (field.getType() == Integer.class)
					rv = Integer.valueOf(value);
				else if (field.getType() == Double.class)
					rv = Double.valueOf(value);
				else
					throw new RuntimeException("暂不支持除String、Integer、Double以外的类型");
				// 设置到字段中
				field.setAccessible(true);
				try {
					field.set(obj, rv);
				} catch (IllegalArgumentException | IllegalAccessException e) {
					throw new RuntimeException(e);
				}
			}
			datas.add(obj);
		}
	}
}

 

© 著作权归作者所有

祁猛
粉丝 2
博文 21
码字总数 14221
作品 0
东城
高级程序员
私信 提问
Tomcat中文乱码问题的原理和解决方法

Tomcat中文乱码问题的原理和解决方法   自从接触Java和JSP以来,就不断与Java的中文乱码问题打交道,现在终于得到了彻底的解决,现将我们的解决心得与大家共享。   一、Java中文问题的由...

孙斐
2013/02/26
250
0
解决Eclipse中.properties文件中文乱码问题

在.properties文件写注释时,发现中文乱码了,由于之前在idea中有见设置.properties文件的编码类型,便找了找乱码原因 在中文操作系统中,Eclipse中的Java类型文件的编码的默认设置是GBK,但...

yzbty23
03/18
23
0
MenuItem 显示中文乱码问题解决方案

MenuItem 显示中文乱码问题解决方案 今天在使用Java做系统托盘图标(TrayIcon),需要为其增加一个右键弹出菜单(PopupMenu),在使用菜单项(MenuItem)时,遇到了一个非常痛苦的事情:中文乱码~...

Java编程思想
2013/10/17
509
0
spring boot 解决后台返回 json 到前台中文乱码之后出现返回json数据报错 500

问题描述 spring Boot 中文返回给浏览器乱码 解析成问号?? fastJson jackJson spring boot 新增配置解决后台返回 json 到前台中文乱码之后,出现返回json数据报错:no convertter for retur...

陈守印
2018/06/15
243
0
0021-使用JDBC向Kudu表插入中文字符-cast的秘密

1.问题描述 使用Impala JDBC向Kudu表中插入中文字符,插入的中文字符串乱码,中文字符串被截断。 继之前文档使用sql拼接方式插入中文字符串乱码解决方法后,此文档描述使用jdbc的PreparedSta...

Hadoop实操
2018/11/19
42
0

没有更多内容

加载失败,请刷新页面

加载更多

html2canvas 生成的图片变模糊解决方案

需求: 背景图片和二维码还有用户微信头像生成一张图片,可供用户下载。打开页面的时候就是一张图可以保存,html2canvas插件即可实现效果,效果是实现了,但是很郁闷,图片模糊了。。。。 为...

前端老手
23分钟前
6
0
语音翻译器在线翻译语音

对于英语不好的朋友来说,如果出国旅游,多多少少都会使用到翻译软件。通过在线翻译的方式,方便彼此的沟通交流。那么,有朋友就在问哪个英语翻译软件最准确?下面就来和大家一起分享下这个简...

401恶户
24分钟前
6
0
国内25家滤波器公司排名

国内做滤波器的企业都有哪些?哪些企业做滤波器是比较知名的?国内滤波器企业排名如何?以下是解优人才网小编给大家的分享,国内前25家做滤波器的企业详细信息。 1、武汉凡谷电子技术股份有限...

猎头悬赏平台
29分钟前
7
0
即时配送,不再只是巨头的战场

9月4日,第十届中国电子商务物流大会暨2019中国同城即时物流行业峰会于杭州召开。会上出现了蜂鸟即配、达达-京东到家、美团配送、点我达、闪送等一众即时配送行业中的知名企业的身影。 在艾媒...

喵二狸
29分钟前
6
0
Moto G 2014 LTE Root

[TOC] 下载moto专用mfastboot mfastboot-v2.zip 下载对应设备的twrp 我的是这个版本 Moto G 2014 LTE thea 刷入twrp # 1. 开启USE调试# 2. 允许OEM解锁# 3. 查看设备adb devices# 4. 进f...

yeahlife
33分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部