JSP 表單包含藏文輸入框,提交到 Servlet 時參數變為亂碼,Base64 轉碼也無法恢復。
request.getParameter() 獲取的已是錯誤字節序列,後續 Base64 無法修復。核心思路:在 JSP 中使用 JavaScript 將藏文轉為 Base64 字符串提交,Servlet 再解碼,繞過容器 URL 解碼環節。
<form id="tibetanForm" action="SaveServlet" method="post">
<textarea name="tibetanContent" id="tibetanContent"></textarea>
<input type="hidden" name="encodedContent" id="encodedContent" />
<button type="button" onclick="submitForm()">提交</button>
</form>
<script>
function submitForm() {
var raw = document.getElementById('tibetanContent').value;
// UTF-8 轉 Base64
var encoded = btoa(unescape(encodeURIComponent(raw)));
document.getElementById('encodedContent').value = encoded;
document.getElementById('tibetanForm').submit();
}
</script>
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
String encoded = request.getParameter("encodedContent");
if (encoded != null) {
try {
// Base64 解碼還原 UTF-8 字符串
byte[] decodedBytes = Base64.getDecoder().decode(encoded);
String tibetan = new String(decodedBytes, StandardCharsets.UTF_8);
// 存入數據庫(確保數據庫連接 useUnicode=true&characterEncoding=UTF-8)
saveToDatabase(tibetan);
} catch (IllegalArgumentException e) {
// 處理非法 Base64
}
}
}
若不想改動前端,需確保全鏈路 UTF-8:
<%@ page contentType="text/html;charset=UTF-8" %>server.xml:<Connector URIEncoding="UTF-8" />request.setCharacterEncoding("UTF-8")?useUnicode=true&characterEncoding=UTF-8但某些老舊環境或代理服務器可能仍導致編碼不一致,Base64 方案更穩健、可控。