首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

Solaris 上 J2EE 應用中文亂碼問題根因分析與解決方案

     編輯:J2EE

問題現象

  • 環境:Solaris 2.7 + miniJ2EE + MySQL
  • Windows/Linux 部署正常,Solaris 部署後所有中文顯示為 `?`

根因分析

Solaris 預設系統編碼為 ASCII,導致 `String.getBytes()` 使用平台預設編碼處理字串,中文高位元組遺失。

驗證程式碼

<%@ page contentType="text/html;charset=gb2312" %>
<%
String str = request.getParameter("i");
// byte[] b = str.getBytes("iso-8859-1"); // 正確
byte[] b = str.getBytes();               // 錯誤:使用平台預設 ASCII
out.println(new String(b, "gb2312"));
%>
  • 瀏覽器輸入 `foo.jsp?i=中文` → 顯示 `??`
  • 改用 `str.getBytes("iso-8859-1")` → 正確顯示「中文」
  • MySQL JDBC 驅動同樣受影響

解決方案比較

方案優點缺點
修改 JDBC 驅動程式徹底解決資料層編碼維護成本高、升級困難
中文編碼為 7-bit (Hex/Unicode Escape)實作簡單、不動驅動程式字串長度倍增、SQL 工具無法直接編輯、特定字元可能衝突 SQL 語法

採用方案:Hex 編碼儲存 (miniJ2EE uniString 模式)

public String encode() {
    try {
        StringBuffer sb = new StringBuffer();
        byte[] bytes = m_enc.isEmpty() ? m_str.getBytes() : m_str.getBytes(m_enc);
        for (int i = 0; i < bytes.length; i++) {
            char ch = Character.forDigit((bytes[i] >> 4) & 0xF, 16);
            sb.append(ch);
            ch = Character.forDigit(bytes[i] & 0xF, 16);
            sb.append(ch);
        }
        return sb.toString();
    } catch (UnsupportedEncodingException e) {
        throw new RuntimeException("Unsupported encoding type.");
    }
}

public void decode(String encodedStr) {
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < encodedStr.length(); i += 2) {
        sb.append((char) Integer.parseInt(encodedStr.substring(i, i+2), 16));
    }
    m_str = new uniString(sb.toString(), "iso-8859-1").cvt(m_enc);
}

最佳實踐:miniJ2EE uniString 類別

  • 封裝編碼轉換邏輯,開發者無需關心底層編碼細節。
  • JSP 輸出:`uniString.gb()` → GB2312
  • 資料庫儲存:`uniString.iso()` → ISO-8859-1
  • 跨平台通用:中文/英文核心作業系統皆正常運作。

關鍵原則總結

  1. 明確指定編碼:永不依賴平台預設編碼(`getBytes()`、`new String(bytes)` 皆需帶 charset 參數)。
  2. 全鏈路一致:JSP pageEncoding、資料庫連線字串 `characterEncoding`、JVM `file.encoding` 參數統一規劃。
  3. 集中管理:採用工具類(如 `uniString`)統一處理編碼轉換,避免分散在業務碼中。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved