&引用;用于编码的不可映射字符";Java中的警告
我目前正在处理一个Java项目,该项目在编译时发出以下警告:&引用;用于编码的不可映射字符";Java中的警告,java,encoding,utf-8,ascii,Java,Encoding,Utf 8,Ascii,我目前正在处理一个Java项目,该项目在编译时发出以下警告: /src/com/myco/apps/AppDBCore.java:439: warning: unmappable character for encoding UTF8 [javac] String copyright = "� 2003-2008 My Company. All rights reserved."; 我不确定如何在日期之前呈现该角色,但它应该是版权符号,并在警告中显示为菱形中的问号 值得
/src/com/myco/apps/AppDBCore.java:439: warning: unmappable character for encoding UTF8
[javac] String copyright = "� 2003-2008 My Company. All rights reserved.";
我不确定如何在日期之前呈现该角色,但它应该是版权符号,并在警告中显示为菱形中的问号
值得注意的是,字符正确地出现在输出工件中,但是警告是一个麻烦,并且有一天包含此类的文件可能会被错误地保存编码的文本编辑器触摸
如何将此字符注入“版权”字符串中,使编译器感到满意,并将符号保留在文件中,而不会出现潜在的重新编码问题?使用“\uxxx”转义格式
根据,版权符号为unicode U+00A9,因此您的行应为:
String copyright = "\u00a9 2003-2008 My Company. All rights reserved.";
尝试:
javac-如果您使用eclipse,则编码ISO-8859-1文件_name.java(即使您编写utf8字符,eclipse也可以为您输入utf8代码。编程时您将看到正常的utf8字符,但后台将是utf8代码)
p.S:如果您在代码中输入静态值,这将正常。例如字符串测试 我也遇到了同样的问题,java错误消息中报告的字符索引不正确。在报告的位置是hex094(cancel而不是quote,但表示为quote)而不是hex022之前,我将其缩小为双引号字符。一旦我更换了hex 022变体,一切都很好。如果您使用的是Maven,请在编译器插件的配置中明确设置
,例如
<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>
org.apache.maven.plugins
maven编译器插件
2.3.2
UTF-8
这对我很有帮助:
您只需指定一个名为
JAVA_工具_选项。如果将此变量设置为-Dfile.encoding=UTF8,
每次启动JVM时,它都会获取此信息
来源:大多数情况下,此编译错误发生在unicode(UTF-8编码)文件编译时
javac -encoding UTF-8 HelloWorld.java
您还可以将此编译选项添加到IDE中
例:Intellij idea(文件>设置>Java编译器)添加为附加命令行参数 -编码:编码 设置源文件编码名称,如EUC-JP和UTF-8。。如果未指定-encoding,则使用平台默认转换器。()
如果在命令提示符下使用Maven Build,还可以使用以下命令:
mvn -Dproject.build.sourceEncoding=UTF-8
将这一行放在Java配置文件上方的yor file.gradle中
apply plugin: 'java'
compileJava {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>
Gradle步骤
如果您使用的是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"}
对于那些想知道为什么在某些系统上而不是在其他系统上发生这种情况的人(使用相同的源代码、构建参数等等),请检查您的
LANG
环境变量。我在LANG=C.UTF-8
时收到警告/错误,但在LANG=en_US.UTF-8
时收到警告/错误请小心\unnn字符。。。它们在进行词法分析之前被解析。例如,如果将此注释/*c:\unit*/添加到代码中,它将不再编译,因为“nit”不是正确的十六进制数。(这在C语言中更好地处理,其中Unicode逃逸只适用于某些上下文-但是,也存在危险的X逃逸序列,这是可怕的。)这听起来更像是创可贴。真正的问题似乎是,您告诉javac希望源文件采用UTF-8格式,而它们实际上采用单字节编码,如ISO-8859-1或windows-1252。@Alan M:根据我的经验,用ASCII保存源文件比在任何地方(Ant、Eclipse、IDEA等)编译源文件时使用正确的编码要容易得多。@Jon,这是Java中的一个基本缺陷;Java源单元以UTF-8、ISO 8859-1、CP1252、MacRoman或其他任何形式编码的事实,在需要它的源单元外部的元数据中处理。这迫使您记住修复ant文件或Eclipse配置等。正如您正确指出的,这绝对是最糟糕的方法,因为信息很脆弱,很容易丢失。在这一点上,将元数据(编码元数据)和数据(读取:源代码)放在一起的语言更加健壮。这是唯一明智的方法。我喜欢这个解决方案。我在ant build.xml中添加了“-encoding UTF-8”作为编译器标记,但仍然得到“警告:编码ASCII的不可映射字符”。如果我将其修改为“-encoding JJJ”,它将无法编译,并抱怨“error:unsupported encoding:jjjj”,因此我知道它正在识别UTF-8,但它似乎仍将.java文件视为ascii。唉,我试过Antjavac任务的“encoding”参数,同样的问题。它可以识别参数,但随后会以某种方式忽略它。@dfrankow:您必须在Build.xml
文件中的相应
调用下添加
。这是一种不好的方法,但你别无选择。我在ant脚本中添加compilearg时也遇到了同样的问题,它工作正常,我是在windows comandline中构建的,t