程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> WebLogic8.1的中文問題解決方法

WebLogic8.1的中文問題解決方法

編輯:關於JAVA

1. 靜態頁面中文信息不能正確顯示

浏覽器端看到中文不能正確顯示,首先應該檢查浏覽器是否支持中文,浏覽器 的編碼是否設置正確.為保證靜態頁面中文信息正確顯示可以在HTML <HEAD> 部分增加:

<meta http-equiv="Content-Type" content="text/html" charset="GBK">

2. JSP裡的中文提示信息不能正確顯示

JSP裡的中文提示信息不能正常顯示,最直接的原因是WebLogic的默認字符集 不是中文字符集(Weblogic8.1裡是setlocal,Weblogic7.0sp3,sp4為UTF-8),因此 可以在JSP頁面中設置字符集,加入如下腳本:

<%@ page contentType="text/html; charset=GBK" %>

這種做法需要對每個JSP頁面進行設置,下面的做法針對所有的jsp頁面進行設 置,比較通用.

3. JSP文件中的提示信息不能正確編譯

JSP文件中的提示信息正確編譯,可以在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>

4. JSP文件之間不能正確傳遞中文數據

JSP文件之間不能正確傳遞中文數據,可以有兩種方法解決.

其一:在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>

當然這種問題也可以自己用java.net.URLEncoder和java.net.URLDecoder來 處理中文.

以上都沒有涉及到數據庫操作,所以當出現亂碼時,逐一分析,

必能找到問題所在.另外可能還需要修改WebLogic應用服務器所在操作系統的 字符集,確保支持中文.

文件名和目錄中的中文問題

如果你的文件名或者目錄是中文怎麼辦呢?上面提到的方法不能解決你的問題 了.這時需要使用java.net.URLEncoder編碼.舉個例子,在test.jsp裡,你需要提 供一個超鏈接到 ./測試/測試.jsp,你可以這麼寫:

<p><a href="<%=java.net.URLEncoder.encode("./測試/測 試.jsp")%>">go</p>

JDBC中的中文問題

如果以上的方法還不能解決你的亂碼問題,那麼可能是JDBC操作中的失誤.這 裡以Oracle9I為例來說明jdbc中的中文問題.首先查詢數據庫:

select * from v where parameter='NLS_CHARACTERSET';

得到數據庫的字符集,如果ZHS16GBK,則JDBC的操作不需要轉碼;如果是 us7ascii,則需要轉碼或者作相關配置.下面以使用不同的數據庫驅動程序為例來 介紹.

1. 使用Thin Driver

如果使用Thin Driver,那麼需要在查詢數據庫的時候將字符集由ISO轉換為 GBK,寫入數據庫的時候將字符集由GBK轉換為ISO.

舉個例子:

插入一條記錄:

Connection conn=null;
PreparedStatement pstmt = null;
try {
String strSql="insert into tabA(A,B) values('1111','王超')";
conn=ds.getConnection();
strSql = new String(strSql.getBytes("GBK"), "ISO-8859-1");
pstmt = conn.prepareStatement(strSql);
pstmt.executeUpdate();
}
catch (Exception e) {
//logger.error(e, e);
}
finally {
disconn(conn, pstmt);
}

查詢一條記錄:

Connection conn=null;
PreparedStatement pstmt = null;
ResultSet rs=null;
try {
String strSql="select B from tabA where A='1111'";
conn=ds.getConnection();
strSql = new String(strSql.getBytes("GBK"), "ISO-8859-1");
pstmt = conn.prepareStatement(strSql);
rs=pstmt.executeQuery();
String strB;
if (rs.next()){
strB=new String(rs.getString(1) .getBytes("ISO-8859-1"), "GBK");
}
catch (Exception e) {
//logger.error(e, e);
}
finally {
disconn(conn, pstmt, rs);
}

這裡建議你在屬性文件裡設置oracle字符集,根據字符集判斷

是否轉碼,以增加應用的移植性.

2.使用OCI Driver

直接使用WebLogic提供的driver,在配置連接池時設置Properties屬性:

weblogic.codeset=GBK,如下圖所示:

當你采用了上面的兩個方法還不能解決你的亂碼時,你檢查一下是否僅僅是孤 僻字不能正常顯示呢?這種情況你需要使用oracle的字符集包: nls_charset12.zip,將該包加入到WebLogic classpath中.

加密中的中文問題

對於不含中文信息的加密和解碼,我想有很多算法可以實現.但由於中文為兩 個字符,普通的加密算法在一次加密一次解密之後無法復原.采用BASE64對中文信 息進行編碼後再加密可以輕松解決這個問題.當然解密之後同樣需要用BASE64解 碼.示例如下:

String pw="中文";
System.out.println(pw);
pw=new sun.misc.BASE64Encoder().encode(pw.getBytes());
System.out.println(pw);
//加密
String pw1=encode(pw);
System.out.println(pw1);
//解密
String pw2=decode(pw1);
System.out.println(pw2);
byte[] bt=new sun.misc.BASE64Decoder().decodeBuffer(pw2);
pw2=new String(bt);
System.out.println(pw2);
下面給出一個完整的使用kaiser算法加密的源代碼:
package test;
/**
* 加密類
*/
import java.lang.Math;
public class SecurityTest {
interface Constants{
public static final int INT_PRIM_NUMBER = 95;
public static final int INT_RETURN_LOOP = 94;
}
/**
* SysBean constructor comment.
*/
public SecurityTest() {
super();
}
/**
* 解密方法
* zhg
* 創建日期 (2002-12-15 10:17:08)
* strCode 需解密的字符串
* 解密後的字符串
* 1.0
*/
public static String decode(String strCode) {
String strOriginal;
int intRnd;
String strRnd;
int intStrLen;
String strDecodeMe = "";
if (strCode.equals(""))
return strDecodeMe;
intStrLen = strCode.length() - 1;
strRnd = strCode.substring(intStrLen / 2, intStrLen / 2 + 1);
intRnd = strRnd.hashCode() - new SecurityTest().startChar();
strCode =
strCode.substring(0, intStrLen / 2)
+ strCode.substring(intStrLen / 2 + 1, intStrLen + 1);
strOriginal =
new SecurityTest().loopCode(
strCode,
Constants.INT_RETURN_LOOP - intRnd);
strDecodeMe = strOriginal;
return strDecodeMe;
}
/**
* 加密方法.隨機取得加密的循環次數,使得每次加密所得的秘文會有所不同
* zhg
* 創建日期 (2002-12-15 10:17:08)
* strOriginal 需加密的字符串
* 加密後的字符串
* 1.0
*/
public static String encode(String strOriginal) {
String strCode;
int intRnd;
char rnd;
int intStrLen;
String strCodeMe = "";
if (strOriginal.equals(""))
return strCodeMe;
//2 到 93 之間的隨即數,即同一原文可能獲得93種不同的秘文
intRnd = (int) (Math.random() * (Constants.INT_RETURN_LOOP - 2) + 2);
strCode = new SecurityTest().loopCode(strOriginal, intRnd);
//對隨機數作偏移加密
rnd = (char) (intRnd + new SecurityTest().startChar());
intStrLen = strCode.length();
strCodeMe =
strCode.substring(0, intStrLen / 2)
+ rnd
+ strCode.substring(intStrLen / 2, intStrLen);
if (strCodeMe.indexOf("'") >= 0)
return encode(strOriginal);
else
return strCodeMe;
}
//基礎的凱撒算法,並對於每一位增加了偏移
private String kaiserCode(String strOriginal) {
int intChar;
String strCode;
int i;
int intStrLen;
int intTmp;
intStrLen = strOriginal.length();
strCode = "";
for (i = 0; i < intStrLen; i++) {
intChar = strOriginal.substring(i, i + 1).hashCode();
intTmp = intChar - this.startChar();
intTmp =
(intTmp * Constants.INT_PRIM_NUMBER + i + 1) % this.maxChar()
+ this.startChar();
strCode = strCode + (char) (intTmp);
}
return strCode;
}
//循環調用凱撒算法一定次數後,可以取得原文
private String loopCode(String strOriginal, int intLoopCount) {
String strCode;
int i;
strCode = strOriginal;
for (i = 0; i < intLoopCount; i++)
strCode = this.kaiserCode(strCode);
return strCode;
}
public static void main(String[] args) throws Exception {
String pw = "中文";
System.out.println(pw);
pw = new sun.misc.BASE64Encoder().encode(pw.getBytes());
System.out.println(pw);
//加密
String pw1 = encode(pw);
System.out.println(pw1);
//解密
String pw2 = decode(pw1);
System.out.println(pw2);
byte[] bt = new sun.misc.BASE64Decoder().decodeBuffer(pw2);
pw2 = new String(bt);
System.out.println(pw2);
}
private int maxChar() {
String str1 = "~";
String str2 = "!";
return str1.hashCode() - str2.hashCode() + 1;
}
private int startChar() {
String str1 = "!";
return str1.hashCode();
}
}

總結

本文列舉了WebLogic中經常碰到的一些中文問題的解決方法.希望讀者能夠靈 活運用.需要提醒的是GBK字符集比GB2312的字庫大,有些不常用字在GB2312裡是 沒有的.所以請盡量使用GBK字符集.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved