問
:
當用 JDBC 向數(shù)據(jù)庫中插入數(shù)據(jù)或從數(shù)據(jù)庫中提取數(shù)據(jù)時 , 為何有時中文字符會顯示為亂碼 ?
答 :
這個問題的實現(xiàn)通常與各個 JDBC driver 的實現(xiàn)有關(guān) . 目前大多數(shù) JDBC driver 采用本地編碼格式來傳輸中文字符 , 例如中文字符 "0x4175" 會被轉(zhuǎn)成 "0x41" 和 "0x75" 進行傳輸 . 因此我們需要對 JDBC driver 返回的字符以及要發(fā)給 JDBC driver 的字符進行轉(zhuǎn)換 .
當用 JDBC driver 向數(shù)據(jù)庫中插入數(shù)據(jù)時 , 需要先將 Unicode 轉(zhuǎn)成 native code; 當 JDBC driver 從數(shù)據(jù)庫中查詢數(shù)據(jù)時 , 則需要將 native code 轉(zhuǎn)換成 Unicode. 下面給出了這兩種轉(zhuǎn)換的實現(xiàn) :
String native2Unicode(String s) {
if (s == null || s.length() == 0) {
return null;
}
byte[] buffer = new byte[s.length()];
for (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) {
c = s.charAt(i);
byte []buf = (""+c).getBytes();
buffer[j++] = (char)buf[0];
buffer[j++] = (char)buf[1];
}
else {
buffer[j++] = s.charAt(i);
}
}
return new String(buffer, 0, j);
}
除使用以上兩個方法之外 , 有些 JDBC driver 如果對 jdbc driver Manager 設(shè)置了正確 的字符集屬性 , 以上 2 個方法就不需要了 .
問 :
當用 Servlet 來處理 http 請求并產(chǎn)生返回的 HTML 頁面時 , 如何使 HTML 頁面中的中文字符能夠正常顯示 ?
答 :
javax.servlet.http.HttpResponse 類用于產(chǎn)生返回頁面 . 通過 HttpResponse 定義的方法 getOutputStream() 可以獲得 ServletOutputStream 的實例 , 這樣用戶就可以利用 ServletOutputStream.write 方法向輸出流中寫入返回頁面的內(nèi)容 . 但是 ServletOutputStream 使用的是缺省的編碼方式 , 如果要使返回頁面中的中文字 符能夠正常顯示 , 最好顯示地指定所用的字符編碼方式 . 通常需要構(gòu)造一個 OutputStreamWriter , 例程如下 :
public void doGet (HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
res.setContentType("text/html");
ServletOutputStream out = res.getOutputStream();
OutputStreamWriter ow = new OutputStreamWriter(out,"GB2312");
ow.write(" 這是測試 ");
ow.flush();
ow.close();
}
問 :
如何設(shè)置 Java WebServer 的 CLASSPATH, 以包含用戶的 class 文件 ?
答 :
有兩種方法可以設(shè)置 Java WebServer 的 CLASSPATH 環(huán)境變量 , 以使用戶編寫的 Servlet 能夠調(diào)用用戶的 class 文件 .
將用戶的 class 文件放到 JavaWebServer_Dir/classes 目錄下 , 在 Java WebServer 啟動時 ,classes 目錄被自動加入到 CLASSPATH 環(huán)境變量中了 .
修改 httpd.nojre 文件 , 將用戶 class 文件所在的路徑名加到 CLASSPATH 環(huán)境變量中.
當用 JDBC 向數(shù)據(jù)庫中插入數(shù)據(jù)或從數(shù)據(jù)庫中提取數(shù)據(jù)時 , 為何有時中文字符會顯示為亂碼 ?
答 :
這個問題的實現(xiàn)通常與各個 JDBC driver 的實現(xiàn)有關(guān) . 目前大多數(shù) JDBC driver 采用本地編碼格式來傳輸中文字符 , 例如中文字符 "0x4175" 會被轉(zhuǎn)成 "0x41" 和 "0x75" 進行傳輸 . 因此我們需要對 JDBC driver 返回的字符以及要發(fā)給 JDBC driver 的字符進行轉(zhuǎn)換 .
當用 JDBC driver 向數(shù)據(jù)庫中插入數(shù)據(jù)時 , 需要先將 Unicode 轉(zhuǎn)成 native code; 當 JDBC driver 從數(shù)據(jù)庫中查詢數(shù)據(jù)時 , 則需要將 native code 轉(zhuǎn)換成 Unicode. 下面給出了這兩種轉(zhuǎn)換的實現(xiàn) :
String native2Unicode(String s) {
if (s == null || s.length() == 0) {
return null;
}
byte[] buffer = new byte[s.length()];
for (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) {
c = s.charAt(i);
byte []buf = (""+c).getBytes();
buffer[j++] = (char)buf[0];
buffer[j++] = (char)buf[1];
}
else {
buffer[j++] = s.charAt(i);
}
}
return new String(buffer, 0, j);
}
除使用以上兩個方法之外 , 有些 JDBC driver 如果對 jdbc driver Manager 設(shè)置了正確 的字符集屬性 , 以上 2 個方法就不需要了 .
問 :
當用 Servlet 來處理 http 請求并產(chǎn)生返回的 HTML 頁面時 , 如何使 HTML 頁面中的中文字符能夠正常顯示 ?
答 :
javax.servlet.http.HttpResponse 類用于產(chǎn)生返回頁面 . 通過 HttpResponse 定義的方法 getOutputStream() 可以獲得 ServletOutputStream 的實例 , 這樣用戶就可以利用 ServletOutputStream.write 方法向輸出流中寫入返回頁面的內(nèi)容 . 但是 ServletOutputStream 使用的是缺省的編碼方式 , 如果要使返回頁面中的中文字 符能夠正常顯示 , 最好顯示地指定所用的字符編碼方式 . 通常需要構(gòu)造一個 OutputStreamWriter , 例程如下 :
public void doGet (HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
res.setContentType("text/html");
ServletOutputStream out = res.getOutputStream();
OutputStreamWriter ow = new OutputStreamWriter(out,"GB2312");
ow.write(" 這是測試 ");
ow.flush();
ow.close();
}
問 :
如何設(shè)置 Java WebServer 的 CLASSPATH, 以包含用戶的 class 文件 ?
答 :
有兩種方法可以設(shè)置 Java WebServer 的 CLASSPATH 環(huán)境變量 , 以使用戶編寫的 Servlet 能夠調(diào)用用戶的 class 文件 .
將用戶的 class 文件放到 JavaWebServer_Dir/classes 目錄下 , 在 Java WebServer 啟動時 ,classes 目錄被自動加入到 CLASSPATH 環(huán)境變量中了 .
修改 httpd.nojre 文件 , 將用戶 class 文件所在的路徑名加到 CLASSPATH 環(huán)境變量中.