java 常見中文亂碼問題解決

關於中文亂碼:html

1、java

1).在jsp頁面上輸入中文,要保證中文不亂碼,有三個前提:web

保證contentType=「text/html;charset=UTF-8」,pageEncoding=「UTF-8」 charset和pageEncoding的編碼一致,且都支持中文,一般建議取值爲UTF-8,還須要擺正瀏覽器的顯示的字符編碼也和請求的jsp頁面的編碼一致。windows

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.tomcat

上面方法對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的 問題:jsp

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

<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.ui

2、解析txt文檔亂碼。

    windows下的文本文件字符集默認是GBK2312/GBK,在使用字符流或字節流讀取文本文件的時候,文本文件多是不一樣的字符集,好比有ANSI、GBK、UTF-八、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);
		}
	}
}
相關文章
相關標籤/搜索