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


112

我目前正在研究一个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/中
jar

Answers:


56

使用“ \ uxxxx”转义格式。

根据Wikipedia所述,版权符号为unicode U + 00A9,因此您的代码行应为:

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

13
小心\ uNNNN字符...在进行词法分析之前会先解析它们。例如,如果将此注释/ * c:\ unit * /放在代码中,它将不再编译,因为“ nit”不是正确的十六进制数。
PeterŠtibraný09年

3
绝对。(这在C#中得到了更好的处理,其中Unicode转义仅在某些情况下适用-但是也存在危险的\ x转义序列,这很糟糕。)
Jon Skeet

5
这听起来更像是创可贴而不是治愈方法。真正的问题似乎是,您告诉javac在真正采用ISO-8859-1或Windows-1252之类的单字节编码的情况下期望源文件采用UTF-8。
艾伦·摩尔

6
@Alan M:根据我的经验,通过将源文件保存为ASCII来确保没有问题比确保在所有可能编译源的地方使用正确的编码要容易得多(Ant,Eclipse,想法等)。
乔恩·斯基特

6
@Jon,这是Java的一个基本缺陷。Java源单元以UTF-8,ISO 8859-1,CP1252,MacRoman或其他格式编码的事实在需要它的源单元外部的元数据中进行处理。这迫使您记住要修复您的ant文件或Eclipse配置等。正如您正确指出的那样,这绝对是最糟糕的方法,因为该信息易碎且容易丢失。将元数据(编码元数据)和数据(读取:源代码)放在一起的语言在此方面更加强大。这是唯一理智的方法。
tchrist

91

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


1
我喜欢这个解决方案。我在我的蚂蚁build.xml中添加了“ -encoding UTF-8”作为compilerarg,但仍收到“警告:编码ASCII不可映射的字符”。如果我将其修改为“ -encoding jjjj”,它将无法编译,并抱怨“错误:不支持的编码:jjjj”,因此我知道它可以识别UTF-8,但似乎仍将.java文件视为ascii。叹。
dfrankow

1
我尝试了ant javac任务的“ encoding”参数,同样的问题。它识别该参数,但是以某种方式忽略它。
dfrankow

20
@dfrankow:您必须在文件中的相应调用<compilerarg line="-encoding utf-8"/>下添加。这是一种不好的方法,但是您别无选择。请参阅顶部的长评论。<javac>Build.xml
tchrist

当我将compilearg添加到可以正常工作的ant脚本中时,我遇到了同样的问题,我是从Windows comandline编译的,奇怪的是我是从eclipse编译的,它警告了eaven缺少compilearg,看起来像是蚀蚀编码权。
simonC

这对我有所帮助:)对于MAC OSX
Arun Abraham

44

如果您使用的是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来构建项目,这是正确的方法,谢谢大家的分享。
Shamik

2
javadoc插件也将抱怨不可映射的字符。最好设置该project.build.sourceEncoding属性。
Emmanuel Bourg 2014年

我已经在使用project.build.sourceEncoding属性,但是由于某种原因它没有正确映射到编译器encoding属性。明确设置它确实可以解决问题
Federico Bonelli 2014年

32

这对我有帮助:

您需要做的就是指定一个名为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中,它解决了我的问题。
cowboi-peng

从命令行输入到构建,效果很好:javac MyJavaFile.java -encoding utf-8 -cp .;lib\*然后运行它时,我不需要添加额外的编码部分。
Azurespot

23

将此行放在Java conf上方的.gradle文件中。

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

您可能需要设置编码compileTestJavajavadoc以及
弗兰克Neblung

8

多数情况下,此编译错误是在Unicode(UTF-8编码)文件编译时出现的

javac -encoding UTF-8 HelloWorld.java

并且您也可以将此编译选项添加到IDE中:Intellij idea
(File> settings> Java Compiler)添加为其他命令行参数

在此处输入图片说明

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


8

摇篮步骤

如果您使用的是Gradle,则可以找到应用Java插件的行:

apply plugin: 'java'

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

compileJava {options.encoding = "UTF-8"}   

如果您有单元测试,那么您可能也希望使用UTF-8进行编译:

compileTestJava {options.encoding = "UTF-8"}

总体摇篮示例

这意味着整个gradle代码如下所示:

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

2

这对我有用-

    <?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>

1

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

  1. 选择项目
  2. 右键单击并选择属性
  3. 在“ 资源面板”上选择“ 资源 ” (右键菜单的顶部,在2点后打开。)
  4. 你可以看到资源面板文本文件编码,选择其他的要

PS:如果您在代码中使用静态值,则可以。例如,字符串测试=“İİİİİııııııççççççç”;


1
您对“在编程时会看到正常的utf8字符,但背景将是utf8代码”的描述没有任何意义。另外,请参阅我对上述问题的长时间评论。
tchrist

我将其更改为ISO-8859-1,但仍然收到有关“编码UTF8的不可映射字符”的编译错误。
pacoverflow

1

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


1

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

                    mvn -Dproject.build.sourceEncoding=UTF-8

1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.