java exception 乱码_java 常见中文乱码问题解决
關于中文亂碼:
一、
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
pageEncoding="UTF-8"%>
中文亂碼userName:
b.jsp
request.setCharacterEncoding("UTF-8");
%>
獲取中文參數值:默認參數在傳輸過程中使用的編碼為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中的:
不要忘了在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 void analyze(File file, List datas, Class beanClass) {
BufferedReader br = null;
List lines = new LinkedList();
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 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);
}
}
}
總結
以上是生活随笔為你收集整理的java exception 乱码_java 常见中文乱码问题解决的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker mysql 日志_dock
- 下一篇: java list clear 垃圾回收