我有一个 MyFaces Facelets 应用程序,其中页面编码有点粗糙。不管怎样,它是用 Eclipse 开发的,用 Ant 构建的,在 Tomcat 2.0.26 中运行得很好。到目前为止一切顺利。
现在,我宁愿使用 Maven 进行构建,所以我制作了几个 pom 文件,在 Netbeans 中打开它们并进行构建,现在我有了一个可以正常部署的 war 文件。然而,在任何 Facelet 页面上,它都会吐出
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:684)
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:554)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1742)
因此,我尝试了很多不同的方法,并且该应用程序实际上运行没有 Facelet 内容的简单页面。但是,如果我只是用 Ant 构建,一切都会运行......所以我的问题是:ant 构建和 Maven 构建之间最有可能导致这种情况的区别是什么?
即使我在 Netbeans 和 pom 文件中配置了 UTF-8,Netbeans 最终还是在经过一些编辑后将 Facelet 文件报告为 ISO-8859-1。
我已经确保大多数中央库都是相同的版本(尤其是 xerces 2.3.0),我添加了一个没有效果的编码 servlet 过滤器。
而且,我宁愿修复 Maven 构建并保留有错误的页面,而不是相反……我的目的是引入 Naven,而不是修复有错误的页面。
以下是 pom.xml 关于编码的内容:
基本上pom.xml有以下设置...
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>${project.build.sourceEncoding}</encoding>>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.2</version>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
....
<properties>
<netbeans.hint.deploy.server>Tomcat60</netbeans.hint.deploy.server>
<project.build.sourceEncoding>utf-8</project.build.sourceEncoding>
</properties>
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException:1 字节 UTF-8 序列的字节 1 无效。
其原因是非 UTF-8 的文件被解析为 UTF-8。解析器很可能遇到
FE
-FF
范围内的字节值。这些值在 UTF-8 编码中无效。
问题可能可以通过将文件的 XML 声明更改为正确的编码或将文件重新编码为 UTF-8 来解决。
在 Windows 上这非常简单。如果没有 Notepad++,请获取它,然后使用“编码”菜单更改编码。
我也遇到同样的问题!
我已经使用以下代码解决了这个问题:
String str = new String(oldstring.getBytes("UTF-8"));
我在Windows机器上使用maven运行一些单元测试时遇到了这个错误。
文件以默认的
Windows-1252
格式写入,然后在尝试将它们读取为 UTF-8
时,一些测试失败。
解决方案是对单元测试中写入的文件强制执行项目源编码:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20</version>
<configuration>
<argLine>-Dfile.encoding=${project.build.sourceEncoding}</argLine>
</configuration>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.20</version>
</dependency>
</dependencies>
</plugin>
其中
project.build.sourceEncoding
在pom属性中定义:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>