在 Java Web 專案開發中,部署至 Tomcat 後偶爾會拋出 MalformedByteSequenceException: 2 字節的 UTF-8 序列的字節 2 無效 異常。這通常發生在解析 XML 配置文件(如 web.xml)時,根因是 JVM 預設編碼與文件實際編碼不一致,導致雙字節 UTF-8 字符的第二個字節無法正確識別。
十二月 08, 2015 7:16:55 下午 org.apache.catalina.core.StandardWrapperValve invoke 嚴重: Servlet.service() for servlet [jsp] in context with path [/test] threw exception [org.apache.jasper.JasperException: XML parsing error on file org.apache.tomcat.util.scan.MergedWebXml] with root cause com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 2 字節的 UTF-8 序列的字節 2 無效。 at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:687) at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:372) ...
在 Tomcat 的 bin/catalina.bat(Windows)或 catalina.sh(Linux)中強制指定 JVM 檔案編碼為 UTF-8:
catalina.batset JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%set JAVA_OPTS=-server -Dfile.encoding=utf-8-Dfile.encoding=utf-8 會將 JVM 的 file.encoding 系統屬性設為 UTF-8,使 XML 解析器、JSP 編譯器等組件在讀取文件時統一使用 UTF-8 解碼,避免雙字節字符截斷導致的「字節 2 無效」錯誤。
重啟 Tomcat 後,在日志中確認無前述異常,且中文內容正常顯示即可。
catalina.sh,在 JAVA_OPTS 定義處追加 -Dfile.encoding=utf-8。