ChatGPT解决这个技术问题 Extra ChatGPT

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

我目前正在开发一个 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/…

F
Fernando Nah

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


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

使用“\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、想法等)。
@Jon,这是 Java 的一个根本缺陷; Java 源单元以 UTF-8、ISO 8859-1、CP1252、MacRoman 或其他格式编码的事实在需要它的源单元外部的元数据中处理。这迫使您记住修复您的 ant 文件或 Eclipse 配置等。正如您正确指出的那样,这绝对是最糟糕的方法,因为信息很脆弱并且很容易丢失。将元数据(编码元数据)和数据(阅读:源代码)放在一个地方的语言在这方面更加健壮。这是唯一理智的方法。
T
Thomas Leonard

如果您使用的是 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 属性,但不知何故它没有正确映射到编译器编码属性。明确设置它就可以了
n
nightlyop

这对我有帮助:

您需要做的就是指定一个名为 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\* 然后在运行它时,我不需要添加额外的编码部分。
A
Alobes5

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

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

您可能还想为 compileTestJavajavadoc 设置编码
A
Alupotha

大多数情况下,编译 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,则使用平台默认转换器。 (文档)


L
Luke Machowski

渐变步骤

如果您使用的是 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"}

Y
Yuri

这对我有用:

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

j
jakar

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


b
baybora.oren

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

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

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


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

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


5
5122014009

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

                    mvn -Dproject.build.sourceEncoding=UTF-8