WebLogic 8.1 默認編碼非中文友好,導致靜態頁、JSP、表單提交、數據庫交互、文件路徑、加密等多個環節出現亂碼。核心策略是全鏈路統一編碼(推薦 GBK),並針對各層配置入口點。
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<%@ page contentType="text/html; charset=GBK" %>
weblogic.xml)<jsp-descriptor>
<jsp-param><param-name>compileCommand</param-name><param-value>javac</param-value></jsp-param>
<jsp-param><param-name>compilerSupportsEncoding</param-name><param-value>true</param-value></jsp-param>
<jsp-param><param-name>encoding</param-name><param-value>GBK</param-value></jsp-param>
</jsp-descriptor>
web.xml:
<context-param>
<param-name>weblogic.httpd.inputCharset./*</param-name>
<param-value>GBK</param-value>
</context-param>
weblogic.xml(推薦):
<charset-params>
<input-charset>
<resource-path>/*</resource-path>
<java-charset-name>GBK</java-charset-name>
</input-charset>
</charset-params>
超鏈接路徑含中文時,必須 URLEncoder.encode:
<a href="<%=java.net.URLEncoder.encode("./測試/測試.jsp")%>">go</a>
SELECT * FROM v$nls_parameters WHERE parameter='NLS_CHARACTERSET';
ZHS16GBK:無需轉碼US7ASCII:需應用層轉碼寫入:
String sql = "insert into tabA(A,B) values('1111','王超')";
sql = new String(sql.getBytes("GBK"), "ISO-8859-1");
pstmt = conn.prepareStatement(sql);
讀取:
String strB = new String(rs.getString(1).getBytes("ISO-8859-1"), "GBK");
建議在屬性文件配置字符集,運行時動態判斷是否轉碼,提升可移植性。
WebLogic 控制台 → 連接池 → Properties 添加:
weblogic.codeset=GBK
若仍有生僻字問題,需將 Oracle nls_charset12.zip 加入 Classpath。
常規加密算法對雙字節字符支持不佳,採用 BASE64 編碼 → 加密 → 解密 → BASE64 解碼 模式:
String pw = "中文";
pw = new sun.misc.BASE64Encoder().encode(pw.getBytes()); // 編碼
String enc = encode(pw); // 加密
String dec = decode(enc); // 解密
byte[] bt = new sun.misc.BASE64Decoder().decodeBuffer(dec);
pw = new String(bt); // 還原明文
文末附帶完整 Kaiser 加密算法實現(含隨機輪數、字符偏移),可直接用於生產環境。
逐項排查,亂碼無處遁形。強烈建議統一使用 GBK,字庫較 GB2312 更完整。