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

sea*_*ges 106 java encoding ascii utf-8

我正在编写一个Java项目,在编译时发出以下警告:

/src/com/myco/apps/AppDBCore.java:439: warning: unmappable character for encoding UTF8
    [javac]         String copyright = "? 2003-2008 My Company. All rights reserved.";
Run Code Online (Sandbox Code Playgroud)

我不确定SO会如何在日期之前渲染角色,但它应该是版权符号,并在警告中显示为钻石中的问号.

值得注意的是,角色正确地出现在输出工件中,但警告是令人讨厌的,包含此类的文件可能有一天会被文本编辑器触及,这会错误地保存编码...

如何将此字符注入"copyright"字符串,以便编译器满意,并且该符号保留在文件中而没有潜在的重新编码问题?

小智 91

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

  • @dfrankow:你必须在你的`Build.xml`文件中的适用的`<javac>`调用下添加`<compilerarg line =" - 编码utf-8"/>`.这是一个糟糕的方法,但你别无选择.请参阅我在顶部的长评论. (20认同)

Jon*_*eet 55

使用"\ uxxxx"转义格式.

根据维基百科,版权符号为unicode U + 00A9,因此您的行应为:

String copyright = "\u00a9 2003-2008 My Company. All rights reserved.";
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*ard 42

如果您正在使用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>
Run Code Online (Sandbox Code Playgroud)

  • javadoc插件也会抱怨不可映射的角色.最好设置`project.build.sourceEncoding`属性. (2认同)

nig*_*yop 30

这对我有帮助:

您需要做的就是指定一个名为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/


Alo*_*es5 20

把这行放在Java conf上面的yor文件.gradle中.

apply plugin: 'java'
compileJava {options.encoding = "UTF-8"}   
Run Code Online (Sandbox Code Playgroud)

  • 您可能还想设置“compileTestJava”和“javadoc”的编码 (2认同)

Luk*_*ski 10

摇篮步骤

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

apply plugin: 'java'
Run Code Online (Sandbox Code Playgroud)

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

compileJava {options.encoding = "UTF-8"}   
Run Code Online (Sandbox Code Playgroud)

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

compileTestJava {options.encoding = "UTF-8"}
Run Code Online (Sandbox Code Playgroud)

总体 Gradle 示例

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

apply plugin: 'java'
compileJava {options.encoding = "UTF-8"}
compileTestJava {options.encoding = "UTF-8"}
Run Code Online (Sandbox Code Playgroud)


Alu*_*tha 7

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

javac -encoding UTF-8 HelloWorld.java
Run Code Online (Sandbox Code Playgroud)

您还可以将此编译选项添加到IDE ex:Intellij idea
(文件>设置> Java编译器)添加为附加命令行参数

在此输入图像描述

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


小智 5

这对我有用:

<?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>
Run Code Online (Sandbox Code Playgroud)