我目前正在开发一个 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/…
尝试:javac -encoding ISO-8859-1 file_name.java
使用“\uxxxx”转义格式。
根据 Wikipedia,版权符号是 unicode U+00A9,因此您的行应为:
String copyright = "\u00a9 2003-2008 My Company. All rights reserved.";
如果您使用的是 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>
project.build.sourceEncoding
属性。
这对我有帮助:
您需要做的就是指定一个名为 JAVA_TOOL_OPTIONS 的环境变量。如果将此变量设置为 -Dfile.encoding=UTF8,则每次启动 JVM 时,它都会获取此信息。
javac MyJavaFile.java -encoding utf-8 -cp .;lib\*
然后在运行它时,我不需要添加额外的编码部分。
将此行放在 Java conf 上方的 .gradle 文件中。
apply plugin: 'java'
compileJava {options.encoding = "UTF-8"}
compileTestJava
和 javadoc
设置编码
大多数情况下,编译 unicode(UTF-8 编码)文件时会出现此编译错误
javac -encoding UTF-8 HelloWorld.java
并且您还可以将此编译选项添加到您的 IDE 中,例如:Intellij idea (File>settings>Java Compiler) add as additional command line parameter
https://i.stack.imgur.com/eqbY6.png
-encoding : encoding 设置源文件编码名称,如 EUC-JP 和 UTF-8.. 如果不指定 -encoding,则使用平台默认转换器。 (文档)
渐变步骤
如果您使用的是 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"}
这对我有用:
<?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>
对于那些想知道为什么在某些系统上而不是在其他系统上发生这种情况的人(具有相同的源、构建参数等),请检查您的 LANG
环境变量。我在 LANG=C.UTF-8
时收到警告/错误,但在 LANG=en_US.UTF-8
时没有。
如果您使用eclipse(即使您编写utf8字符,Eclipse也可以为您放置utf8代码。您在编程时会看到正常的utf8字符,但背景将是utf8代码);
选择项目右键单击并选择属性在资源面板上选择资源(在2之后打开的右上方菜单。)您可以在资源面板中看到,文本文件编码,选择其他您想要的
PS:如果您在代码中使用静态值,则可以。例如 String test = "İİİİİİıııııııçççççç";
我遇到了同样的问题,java错误消息中报告的字符索引不正确。在报告的位置为十六进制 094(取消而不是引号,但表示为引号)而不是十六进制 022 之前,我将其缩小到双引号字符。一旦我换成十六进制 022 变体,一切都很好。
如果从命令提示符使用 Maven Build,也可以使用以下命令:
mvn -Dproject.build.sourceEncoding=UTF-8
Build.xml
文件中适用的<javac>
调用下添加<compilerarg line="-encoding utf-8"/>
。这是一个不好的方法,但你别无选择。请参阅顶部的长评论。