Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Maven:UTF-8中的源代码编码不起作用?_Java_Maven_Encoding_Utf 8 - Fatal编程技术网

Java 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

我正在将一个项目从Ant转换为Maven,我在处理UTF-8字符的特定单元测试方面遇到了问题。问题与以下字符串有关:

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构建项目时,测试运行没有任何问题

  • 调试Unicode问题时,请确保将所有内容都转换为ASCII,这样您就可以在不进行猜测的情况下读取和理解字符串中的内容。这意味着您应该使用,例如,
    StringEscapeUtils
    from将
    ä
    转换为
    \u00e4
    。这样,您可以确保看到
    ,因为控制台无法打印它。您可以将“(
    \u0020
    )与“(
    \u00a0
    )区分开来

    在测试用例中,尽早检查输入的转义版本,以确保数据实际上是您期望的

    因此,上述代码应为:

    assertEquals("\u010d\u00e4\u....", escape(l_string));
    
  • 确保对文件I/O使用正确的编码。切勿使用Java的默认编码,请始终使用
    InputStreamReader
    /
    OutputStreamWriter
    ,并指定要使用的编码

  • POM看起来是正确的。使用
    -X
    运行
    mvn
    ,确保它选择了正确的选项,并使用正确的选项运行Java编译器<代码>mvn帮助:有效的pom也可能有帮助

  • 反汇编类文件以检查字符串。Java将使用
    表示它无法读取某些内容

    如果从
    System.out.println(“>>>”+l\u字符串)获取
    ,这意味着代码不是用UTF-8编译的,或者源文件可能是用另一种Unicode编码(UTF-16或类似编码)保存的

    问题的另一个来源可能是属性文件。确保它与ISO-8859-1一起保存,并且没有被编译过程修改

  • 确保Maven确实编译了您的文件。使用
    mvn clean
    强制完全重新编译

  • 我自己找到了一个“解决方案”:

    我必须将编码传递到maven surefire插件中,但通常

    <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