【问题标题】:Error: unmappable character for encoding UTF8 during maven compilation错误:在 Maven 编译期间用于编码 UTF8 的不可映射字符
【发布时间】:2012-02-17 04:17:54
【问题描述】:

我正在使用 maven 编译一个包,它说构建失败并出现以下编译错误:

SpanishTest.java[31, 81] 用于编码 UTF8 的不可映射字符

我在网上搜索了很多人,将源编码从 UTF-8 更改为 ISO-8859-1 似乎可行,但我仍然遇到相同的编译错误。我正在使用 32 位 Ubuntu。这是该标签在我的 pom.xml 中的外观

<project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>

即使我将&lt;project.build.outputEncoding&gt; 标签更改为 ISO-8859-1,我仍然会收到错误。可能是因为 java 版本吗?我的系统上同时安装了 Sun java 和 openjdk。

谁能告诉我该怎么做。

谢谢

【问题讨论】:

  • 你看过SpanishTest.java的第31行第81个字符吗?
  • 是的,它有 ó 、 é 、 í 等字符,因此编译不成功。
  • 这些字符在文件中究竟是如何表示的?他们使用了哪些字节
  • 是的,你肯定需要显示实际的 bytes 是什么地方失败了。 UTF8 是一种编码,这意味着它期望某些字节处于某些排列中,否则会失败。即,您发布的那些字符对于 UTF8 hexutf8.com/?q=20c3b3202c20c3a920 来说不是问题,但我敢打赌,您认为 SpanishTest.java 中的内容有点偏离

标签: java maven character-encoding


【解决方案1】:

将 maven-compiler-plugin 配置为使用与源文件编码相同的字符编码(例如):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.3.2</version>
    <configuration>
        <source>1.6</source>
        <target>1.6</target>
        <encoding>UTF-8</encoding>
    </configuration>
</plugin>

默认情况下,许多 maven 插件将使用“project.build.sourceEncoding”属性,因此在您的 pom 中设置此属性将涵盖大多数插件。

<project>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
...

但是,我更喜欢在每个支持它的插件配置中设置编码,因为我喜欢明确。

当您的源代码由 maven-compiler-plugin 编译时,您的源代码文件将由编译器插件使用编译器插件配置的任何编码读取。如果您的源文件的编码与编译器插件使用的编码不同,则可能某些字符可能在两种编码中都不存在。

很多人喜欢将源文件的编码设置为 UTF-8 以避免这个问题。要在 Eclipse 中执行此操作,您可以右键单击项目并选择 Properties->Resource->Text File Encoding 并将其更改为 UTF-8。这将以 UTF-8 对所有源文件进行编码。 (您还应该像上面提到的那样显式配置 maven-compiler-plugin 以使用 UTF-8 编码。)由于您的源文件和编译器插件都使用相同的编码,您在编译期间不应再有任何不可映射的字符。

注意,你也可以在eclipse中通过Window->Preferences->General->Workspace->Text File Encoding来全局设置文件编码。您还可以通过 Window->Preferences->General->Content Types 设置每种文件类型的编码。

【讨论】:

  • 请注意,我发现project.build.sourceEncoding 不起作用的情况。使用maven-compiler-plugin(第一个代码片段)的插件配置。谢谢你的回答。
  • 只有&lt;project.build.sourceEncoding&gt;Cp1252&lt;/project.build.sourceEncoding&gt; 适合我。
【解决方案2】:

如果上述答案不起作用,请将编码更改为 cp1252 或手动删除所有出现的特殊字符。对我来说,特殊字符导致了注释块内的问题。

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-compiler-plugin</artifactId>
   <version>2.3.2</version>
   <configuration>
       <encoding>Cp1252</encoding>
   </configuration> 
</plugin>

PS:我使用的是 GNU/Linux 操作系统(Ubuntu)。

【讨论】:

  • 这是否意味着特殊字符来自 Windows?
  • 看起来,是的。
  • 为我工作 ;) : ubuntu 18. 谢谢
【解决方案3】:

我刚刚遇到了这个问题并最终解决了这个问题:我在 Notepad++ 中打开了有问题的 .java 文件,然后从编码菜单中选择了“转换为 UTF-8 而不使用 BOM”。已保存。重新运行maven,一切正常。

如果违规资源未以 UTF-8 编码 - 正如您为 maven 编译器插件配置的那样 - 您会在 Np++ 的编码菜单中看到文件的 当前 编码旁边的项目符号(在我的例子中,我看到它被设置为“在 ANSI 中编码”)。

因此,您的 maven 编译器插件调用了 Java 编译器,并将 -encoding 选项设置为 UTF-8,但编译器遇到了 ANSI 编码的源文件并将其报告为错误。这曾经是 Java 5 中的警告,但在 Java 6+ 中被视为错误

【讨论】:

    【解决方案4】:

    这发生在以下场景中: 在 Windows 上工作时,IDE 很可能配置为在 Cp1252 中编辑文件,这是 Microsoft 对 latin-11 的改编。开发人员签入,持续集成服务器(通常在 Linux 上运行,现在都是 utf8)获取文件,并尝试编译为 UTF-8 文件,因此出现警告。

    尝试将编码更改为 cp1252。这行得通。为避免将来出现此类问题,请在所有开发人员机器上使用相同的编码。

    祝你好运……

    【讨论】:

      【解决方案5】:

      我也遇到过类似的问题,但我的解决方案不同。我转到提到的代码行并遍历字符(对于 SpanishTest.java[31, 81],转到第 31 行和第 81 个字符,包括空格)。我在评论中观察到导致问题的撇号。虽然不是一个错误,但 maven 编译器会报告问题,在我的情况下,可以删除 maven 的“非法”字符。哈哈。

      【讨论】:

        【解决方案6】:

        当我检查控制台时,我发现 maven 编译器的版本是 2.5.1,但另一方面,我尝试使用 maven 3.2.2 构建我的项目。所以在 pom.xml 中写入确切版本后,它运行良好. 这是完整的标签:

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.2</version>
          <configuration>
           ....
          <configuration>
        </plugin>
        

        【讨论】:

          【解决方案7】:

          就我而言,我使用这种方法解决了这个问题:

          1. 设置新环境变量:JAVA_TOOL_OPTIONS = -Dfile.encoding=UTF8
          2. 或设置MAVEN_OPTS= -Dfile.encoding=UTF-8

          【讨论】:

            【解决方案8】:

            在 maven-compiler 插件中设置 incodign 属性对我有用。代码示例如下

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            

            【讨论】:

              【解决方案9】:

              我猜问题发生在编码字符串上。我解决了同样的问题。请尝试在编码字符串的最后添加 trim()。

              【讨论】:

                猜你喜欢
                • 2013-08-17
                • 2012-07-06
                • 2012-11-05
                • 1970-01-01
                • 2019-02-04
                • 2012-12-15
                • 1970-01-01
                • 2020-01-22
                • 2011-06-27
                相关资源
                最近更新 更多