Java中的“用于编码的不可映射字符”警告

Posted

技术标签:

【中文标题】Java中的“用于编码的不可映射字符”警告【英文标题】:"unmappable character for encoding" warning in Java 【发布时间】:2010-10-02 16:01:05 【问题描述】:

我目前正在处理一个在编译时发出以下警告的 Java 项目:

/src/com/myco/apps/AppDBCore.java:439: warning: unmappable character for encoding UTF8
    [javac]         String copyright = "� 2003-2008 My Company. All rights reserved.";

我不确定 SO 将如何在日期之前呈现字符,但它应该是版权符号,并在警告中显示为菱形中的问号。

值得注意的是,该字符正确显示在输出工件中,但警告令人讨厌,并且包含此类的文件有朝一日可能会被保存编码错误的文本编辑器触及...

如何将此字符注入“版权”字符串,以便编译器满意,并且符号保留在文件中而不会出现潜在的重新编码问题?

【问题讨论】:

有兴趣真正了解哪些字节构成了该版权字符,即hexdump AppDBCore.java 我不知何故怀疑它的\u00a9,而是因为您的系统设置而部分适用于您。上面的问号用于替换传入的字符,其值在 Unicode 中未知或无法表示 hexutf8.com/… 【参考方案1】:

尝试: javac -encoding ISO-8859-1 file_name.java

【讨论】:

我喜欢这个解决方案。我在我的 ant build.xml 中添加了“-encoding UTF-8”作为编译器参数,但仍然收到“警告:用于编码 ASCII 的不可映射字符”。如果我将它修改为“-encoding jjjj”,它将无法编译,抱怨“错误:不支持的编码:jjjj”,所以我知道它正在识别 UTF-8,但它似乎仍然被视为 .java 文件作为 ascii。叹息。 我尝试了ant javac任务的“encoding”参数,同样的问题。它可以识别参数,然后以某种方式忽略它。 @dfrankow:您必须在您的Build.xml 文件中适用的<javac> 调用下添加<compilerarg line="-encoding utf-8"/>。这是一个不好的方法,但你别无选择。在顶部查看我的长评论。 我在 ant 脚本中添加 compilearg 时遇到了同样的问题,它工作正常,我是从 Windows 命令行构建的,奇怪的是我是从 Eclipse 构建的compilearg,看起来 eclipse 需要注意编码权。 这对我有帮助 :) 用于 MAC OSX【参考方案2】:

使用“\uxxxx”转义格式。

根据Wikipedia,版权符号是unicode U+00A9,所以你的行应该是:

String copyright = "\u00a9 2003-2008 My Company. All rights reserved.";

【讨论】:

小心使用 \uNNNN 字符...在进行词法分析之前对它们进行解析。例如,如果您将此注释 /* c:\unit */ 放到您的代码中,它将不再编译,因为“nit”不是正确的十六进制数。 当然。 (这在 C# 中处理得更好,其中 unicode 转义仅适用于某些上下文 - 但是还有危险的 \x 转义序列,这很糟糕。) 这听起来更像是一种创可贴而不是治愈方法。真正的问题似乎是你告诉 javac 当源文件真的是像 ISO-8859-1 或 windows-1252 这样的单字节编码时,它们需要 UTF-8 格式。 @Alan M:根据我的经验,通过将源文件保存为 ASCII 来确保不会出现问题要比确保使用正确的编码要容易得多 在任何地方您的源代码都可能被编译(Ant、Eclipse、IDEA 等)。 @Jon,这是 Java 的一个根本缺陷; Java 源单元以 UTF-8、ISO 8859-1、CP1252、MacRoman 或其他格式编码的事实在需要它的源单元外部的元数据中处理。这迫使您记住修复您的 ant 文件或 Eclipse 配置等。正如您正确指出的那样,这绝对是最糟糕的方法,因为信息很脆弱并且很容易丢失。将元数据(编码元数据)和数据(阅读:源代码)放在一个地方的语言在这方面更加健壮。这是唯一理智的方法。【参考方案3】:

如果您使用的是 Maven,请在编译器插件的配置中明确设置 <encoding>,例如

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

【讨论】:

如果人们使用 maven 来构建他们的项目,这是正确的方法,谢谢分享。 javadoc 插件也会抱怨无法映射的字符。最好设置project.build.sourceEncoding 属性。 我已经在使用 project.build.sourceEncoding 属性,但不知何故它没有正确映射到编译器编码属性。明确设置它就可以了【参考方案4】:

这对我有帮助:

您需要做的就是指定一个名为 JAVA_TOOL_OPTIONS。如果将此变量设置为 -Dfile.encoding=UTF8, 每次启动 JVM 时,它都会获取此信息。

来源:http://whatiscomingtomyhead.wordpress.com/2012/01/02/get-rid-of-unmappable-character-for-encoding-cp1252-once-and-for-all/

【讨论】:

哇它好用,我只需将它添加到我的 .bashrc 中,它就解决了我的问题。 效果很好,我从命令行输入构建:javac MyJavaFile.java -encoding utf-8 -cp .;lib\* 然后在运行它时,我不需要添加额外的编码部分。【参考方案5】:

把这一行放在你的 .gradle 文件中,放在 Java conf 上面。

apply plugin: 'java'
compileJava options.encoding = "UTF-8"   

【讨论】:

您可能还想为compileTestJavajavadoc 设置编码【参考方案6】:

这个编译错误大多数时候是在编译 unicode(UTF-8 编码)文件时出现的

javac -encoding UTF-8 HelloWorld.java

您还可以将此编译选项添加到您的 IDE 例如:Intellij 想法 (File>settings>Java Compiler) 添加为附加命令行参数

-encoding : 编码 设置源文件编码名称,如 EUC-JP 和 UTF-8。如果不指定 -encoding,则使用平台默认转换器。 (DOC)

【讨论】:

【参考方案7】:

Gradle 步骤

如果您使用的是 Gradle,那么您可以找到应用 java 插件的行:

apply plugin: 'java'

然后将编译任务的编码设置为UTF-8:

compileJava options.encoding = "UTF-8"   

如果你有单元测试,那么你可能也想用 UTF-8 编译它们:

compileTestJava options.encoding = "UTF-8"

整体 Gradle 示例

这意味着整个 gradle 代码看起来像这样:

apply plugin: 'java'
compileJava options.encoding = "UTF-8"
compileTestJava options.encoding = "UTF-8"

【讨论】:

【参考方案8】:

这对我有用:

<?xml version="1.0" encoding="utf-8" ?>
<project name="test" default="compile">
    <target name="compile">
        <javac srcdir="src" destdir="classes" encoding="iso-8859-1" debug="true" />
    </target>
</project>

【讨论】:

【参考方案9】:

对于那些想知道为什么会在某些系统上而不是在其他系统上发生这种情况的人(具有相同的源、构建参数等),请检查您的 LANG 环境变量。我在LANG=C.UTF-8 时收到警告/错误,但在LANG=en_US.UTF-8 时没有。

【讨论】:

【参考方案10】:

如果你使用eclipse(即使你写utf8字符,Eclipse也可以为你放置utf8代码。你编程时会看到正常的utf8字符,但背景是utf8代码);

    选择项目 右键单击并选择属性资源面板上选择Resource(在2之后打开的右上方菜单。) 你可以在资源面板中看到,文本文件编码,选择其他你想要的

P.S : 如果您在代码中使用静态值,则可以。例如 String test = "İİİİİİııııııçççççç";

【讨论】:

您对“您在编程时会看到正常的 [a] utf8 字符但 [the] 背景将是 utf8 代码”的描述毫无意义。另外,请参阅我对上述问题的长评论。 我将其更改为 ISO-8859-1,但仍然收到有关“用于编码 UTF8 的不可映射字符”的编译错误。【参考方案11】:

我遇到了同样的问题,java错误信息中报告的字符索引不正确。在报告的位置为十六进制 094(取消而不是引号,但表示为引号)而不是十六进制 022 之前,我将其缩小到双引号字符。一旦我换成十六进制 022 变体,一切都很好。

【讨论】:

【参考方案12】:

如果从命令提示符使用 Maven Build,也可以使用以下命令:

                    mvn -Dproject.build.sourceEncoding=UTF-8

【讨论】:

以上是关于Java中的“用于编码的不可映射字符”警告的主要内容,如果未能解决你的问题,请参考以下文章

java程序中很多警告,如何修改掉?

某些 Java 泛型类型转换中的类型安全警告是啥意思?

如何强制 AutoClosable 警告传播到 Java 中的类调用者?

怎么去掉eclipse项目中的感叹号,我编写的java程序中都没有出现警告,而项目chapter3中却出现了警告!

在 IntelliJ 中为一行禁用警告

Java中的警告:The serializable class FirstApplet does not declare a static final,请问是啥错误?