Java Maven:UTF-8中的源代码编码不起作用?
我正在将一个项目从Ant转换为Maven,我在处理UTF-8字符的特定单元测试方面遇到了问题。问题与以下字符串有关:Java Maven:UTF-8中的源代码编码不起作用?,java,maven,encoding,utf-8,Java,Maven,Encoding,Utf 8,我正在将一个项目从Ant转换为Maven,我在处理UTF-8字符的特定单元测试方面遇到了问题。问题与以下字符串有关: String l_string = "ČäÁÓý\n€řЖжЦ\n№ЯФКЛ"; 问题是单元测试失败,因为字符串的读取方式如下: ?äÁÓý €???? ????? java类保存为UTF-8,我还在pom.xml中指定UTF-8的构建编码 以下是我的pom.xml的摘录: ... <properties> <project.build.sourceEnc
String l_string = "ČäÁÓý\n€řЖжЦ\n№ЯФКЛ";
问题是单元测试失败,因为字符串的读取方式如下:
?äÁÓý
€????
?????
java类保存为UTF-8,我还在pom.xml中指定UTF-8的构建编码
以下是我的pom.xml的摘录:
...
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.15</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-report-plugin</artifactId>
<version>2.15</version>
</plugin>
</plugins>
</build>
应该注意的是,当我使用Ant构建项目时,测试运行没有任何问题
StringEscapeUtils
from将ä
转换为\u00e4
。这样,您可以确保看到?
,因为控制台无法打印它。您可以将“(\u0020
)与“(\u00a0
)区分开来
在测试用例中,尽早检查输入的转义版本,以确保数据实际上是您期望的
因此,上述代码应为:
assertEquals("\u010d\u00e4\u....", escape(l_string));
InputStreamReader
/OutputStreamWriter
,并指定要使用的编码-X
运行mvn
,确保它选择了正确的选项,并使用正确的选项运行Java编译器<代码>mvn帮助:有效的pom也可能有帮助?
表示它无法读取某些内容
如果从System.out.println(“>>>”+l\u字符串)获取?
代码>,这意味着代码不是用UTF-8编译的,或者源文件可能是用另一种Unicode编码(UTF-16或类似编码)保存的
问题的另一个来源可能是属性文件。确保它与ISO-8859-1一起保存,并且没有被编译过程修改
mvn clean
强制完全重新编译<encoding>${project.build.sourceEncoding}</encoding>
${project.build.sourceEncoding}
不起作用。我仍然不知道为什么,但当我将命令行参数传递到插件中时,测试工作正常:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.15</version>
<configuration>
<argLine>-Dfile.encoding=UTF-8</argLine>
</configuration>
</plugin>
org.apache.maven.plugins
maven surefire插件
2.15
-文件编码=UTF-8
感谢您的回复和其他评论 问题不在于源文件的编码(以及类文件中的字符串),而在于
System.out
的隐式PrintStream
的编码。它使用表示系统编码的file.encoding
,这在Windows的ANSI代码页中
您必须使用OEM代码页设置一个PrintWriter
(或者您使用用于此的类:)
另请参见中的各种错误:这对我很有用:
...
<properties>
**<project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
<project.reporting.outputEncoding>ISO-8859-1</project.reporting.outputEncoding>**
</properties>
...
<build>
<finalName>Project</finalName>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
**<encoding>${project.build.sourceEncoding}</encoding>**
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.2</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
</configuration>
</plugin>
</plugins>
</build>
。。。
**ISO-8859-1
ISO-8859-1**
...
项目
src
maven编译器插件
2.3.2
1.6
1.6
**${project.build.sourceEncoding}**
maven战争插件
2.2
网络内容
我遇到了这类非常有弹性的问题,设置了环境变量
MAVEN_OPTS=-Dfile.encoding=UTF-8
为我解决了这个问题。测试代码是什么?它是否在任何地方使用平台默认编码?或者测试中的代码在某个地方会这样做吗?@Joachim Sauer:I更新了我的帖子。@softandsafe:这不是一个有用的测试,因为如果您的输出控制台没有设置为使用unicode编码,那么即使
l_string
包含正确的数据(即,即使它被正确编译),输出也会看起来是错误的。您是否有一个实际的断言失败?或者你只是通过视觉验证它是否有效?@JoachimSauer:我又更新了我的帖子。我有一个实际的断言失败了,真奇怪。surefire插件根本不应该关心这个问题。您是否在损坏的模块上使用了mvn help:effective pom
,以查看哪些选项传递给了surefire?我想知道默认编码是什么;可能是cp15xx
。尝试以下操作:删除-Dfile.encoding
并在测试中打印Charset.defaultCharSet()
的结果。我也在想为什么这很重要;使用编译器插件编译代码;surefire应该独立于编译步骤。windows-1252
。它似乎使用操作系统默认编码,但pom文件中的所有位置都将编码设置为UTF-8,即使在surefire-plugin中也是如此。可能更具弹性的解决方案是-Dfile.encoding=${project.build.sourceEncoding}
这仍然是开放的。问题已从codehaus转移到apache
...
<properties>
**<project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
<project.reporting.outputEncoding>ISO-8859-1</project.reporting.outputEncoding>**
</properties>
...
<build>
<finalName>Project</finalName>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
**<encoding>${project.build.sourceEncoding}</encoding>**
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.2</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
</configuration>
</plugin>
</plugins>
</build>
MAVEN_OPTS=-Dfile.encoding=UTF-8