具有特殊字符的 Facelets 页面导致 MalformedByteSequenceException:UTF8Reader.invalidByte 处的 3 字节 UTF-8 序列的字节 2 无效

Facelets page with special characters causes MalformedByteSequenceException: Invalid byte 2 of 3-byte UTF-8 sequence at UTF8Reader.invalidByte

我正在将一个旧的和一些新的东西合并到一个网络应用程序中。但是,当使用瑞典字母时,页面将失败。这似乎不是服务器问题,因为旧的 .jsp 页面将正确加载。

我在 xhtml 中缺少什么 header?

mar 25, 2015 11:50:53 FM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/BowlingInfo] threw exception
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 2 of 3-byte UTF-8 sequence.
    at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:691)

<!DOCTYPE html>
<html lang="sv-SE" 
    xmlns="http://www.w3c.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:head>
    <link rel="stylesheet" href="bowling-style.css" />
    <meta http-equiv="content-type" content="text/html" charset="ISO-8859-1" />
</h:head>
<h:body>
    <!-- FAIL -->
    <h1>Hallmästaren</h1>
</h:body>
</html>

可用的旧页面示例

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="f"  uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h"  uri="http://java.sun.com/jsf/html"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Svalövs bowlinghall</title>
<script type="text/JavaScript">
        <!--
        var currentTime = new Date()
        function AutoRefresh( t ) {
                setTimeout("location.reload(true);", t);
        }
        function GetServerDate() {
                var date = new Date();
                dateNow = date;
                document.write(dateNow);
                return dateNow;
        }
        </script>
        <link rel="stylesheet" type="text/css" href="bowling-style.css" />  
</head>
<body onload="JavaScript:AutoRefresh(15000);" bgcolor="C2F2BD">
<f:view>
.........

Facelets 默认使用 UTF-8 编码(作为 World Domination 的一部分)。您应该将所有编辑器和图层配置为使用 UTF-8。

在您的具体情况下,至少有两个可能的原因:

  1. Eclipse 应通过 Window > 首选项 > 常规 > 工作区 > 文本文件编码 配置为使用 UTF-8 保存文件。

  2. HTTP/HTML Content-Type header 应该指定 charset=UTF-8,与您在 JSP 中所做的完全一样原因更改为旧版 ISO-8859-1 编码。

    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />