在使用 JDBC 讀寫中文資料時,常會遇到編碼不匹配導致亂碼的問題。本文提供兩種可行的解決方案,適用於 Java Applet 透過 Socket 傳輸資料至資料庫的情境。
利用 DataOutputStream 搭配 BufferedOutputStream 將資料庫擷取的位元組直接寫入 Socket 輸出串流:
byte[] buff = new byte[512]; // 緩衝區大小可自行調整
Socket sock = ... // 初始化 Socket
ResultSet rs = ... // 初始化 ResultSet
DataOutputStream dataout = new DataOutputStream(
new BufferedOutputStream(sock.getOutputStream()));
InputStream in = rs.getAsciiStream(column_index); // column_index 為欄位索引
for (;;) {
int size = in.read(buff);
if (size == -1) break;
dataout.write(buff, 0, size);
}
dataout.flush();
此方式可直接將中文資料傳送至客戶端。
將上述程式碼第 6 行改為:
InputStream in = Runtime.getRuntime().getLocalizedInputStream(
rs.getAsciiStream(column_index));
注意: getLocalizedInputStream() 在 JDK 1.1 已被標記為 deprecated,未來版本可能移除,不建議在新專案中使用。
為相容新版 JDK,建議採用 BufferedReader 搭配 InputStreamReader:
BufferedReader br = new BufferedReader(
new InputStreamReader(rs.getAsciiStream(column_index)));
此方式可正確處理字元編碼轉換,是目前較標準的作法。