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

解決 Java 中「2 字節 UTF-8 序列的字節 2 無效」異常的完整指南

     編輯:Java 相關知識

問題背景

在 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:

  1. 打開 catalina.bat
  2. 找到 set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%
  3. 在其上方新增一行:
    set JAVA_OPTS=-server -Dfile.encoding=utf-8

原理解析

-Dfile.encoding=utf-8 會將 JVM 的 file.encoding 系統屬性設為 UTF-8,使 XML 解析器、JSP 編譯器等組件在讀取文件時統一使用 UTF-8 解碼,避免雙字節字符截斷導致的「字節 2 無效」錯誤。

驗證方式

重啟 Tomcat 後,在日志中確認無前述異常,且中文內容正常顯示即可。

注意事項

  • 若專案中仍有非 UTF-8 編碼的文件,需另行轉碼或指定編碼讀取。
  • Linux 環境請修改 catalina.sh,在 JAVA_OPTS 定義處追加 -Dfile.encoding=utf-8。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved