我所有的项目都使用Cp1252编码,除了几个我用UTF-8编码的文件,这些文件包含特殊字符。
当我运行安装时,在这些文件中我会得到几个错误:unclosed character literal
、illegal character: '\u00a8'
。在使用UTF8中的编码插件进行安装时:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
错误不再显示在上述文件中,但在许多其他文件中,显示的错误为:unmappable character for encoding UTF-8.
。
我可以只为某些文件指定UTF-8编码吗?
另外,maven显示的错误如下:
folder/file.java:[10,19] unclosed character literal
folder/file.java:[10,22] unclosed character literal
folder/file.java:[13,19] unclosed character literal
这些数字意味着什么?它似乎不是错误所在的行号。
发布于 2022-01-26 14:20:59
[10,19]
的意思是:第10行的第19个字符。
@VGR精确地解释了为什么在as CP1252中读取UTF-8编码的源文件会导致编译失败:任何非ASCII字符在UTF-8中至少被编码为2字节。如果将这些字节错误地读取为Cp1252,则会得到2个或更多的gobbledygook字符。考虑到字符文本中只允许一个字符,代码中现在有编译器错误。
没有办法告诉maven,有些文件是UTF-8,而有些文件是Cp1252,除非您单独运行编译,这很难执行,非常混乱,很难维护(所以,这是个糟糕的主意),除非您涉及存根或“幸运”,而且这两批文件中有一批是“自包含的”(绝对不包含其他“批处理”中的任何内容),否则根本无法工作。
因此,让我们把它作为可行的选择来处理。剩下两种选择:
正确的选择-所有的UTF-8,所有的时间
将所有源文件视为UTF-8。这比听起来容易得多;所有的ASCII字符在UTF-8和Cp1252中都是相同的编码,所以只需要检查非ASCII字符。这很容易找到:实际上,它的所有字节都在126以上。你可以用很多工具去找这些。例如,关于如何在linux上执行此操作的这是一个有答案的问题。
用任何编辑器打开这些文件,说明它使用的是哪种编码(大多数开发人员编辑器都是这样做的),重新加载编码直到这个字符看起来正确,然后重新保存为UTF-8,瞧。没有特殊字符的所有字符同时都是UTF-8和Cp1252 -您可以简单地使用UTF-8编码编译它们,它将工作得很好。
现在,您的所有代码都在UTF_8中。相应地配置您的IDE项目/将您的maven pom放在'it isutf-8‘上,所有支持maven的项目工具都会自动启动。
更糟糕的选择-反斜杠-你逃跑
如果您不能这样做,因为有些工具读取这些源文件(不是maven和javac,而且实际上也没有从java生态系统中读取任何主要内容,因为java生态系统都很清楚),并且坚持将其解析为Cp1252,对此您无能为力:有一种方法可以从源文件中删除所有非ASCII:反斜杠-u转义。
\u0123
的概念在任何java文件中都是合法的,而不仅仅是字符串文本。它的意思是:具有该值的unicode字符(十六进制)。例如,这是:
class Test {
public static void main(String[] args) {
//This does nothing, right? \u000aSystem.out.println("Hello!");
}
}
运行它时,实际上会打印即使系统在评论中..。或者是吗?
\u000a
是换行符。因此,上面的文件被解析为一行上的注释,然后是换行符,因此,System.out语句确实在其中,而不是在注释中。许多工具都不知道这一点(例如,崇高的文本和co会将sysout语句呈现为公共绿色),但是javac
(实际上,Java )在这一点上非常清楚:上面的代码中有一个真正的print语句,而不是注释掉的。
因此,您可以搜索所有非ASCII并用u转义替换它,而现在您的代码是混合的:无论使用哪种编码,它的解析都是相同的,只要它是ASCII兼容的编码,而且几乎所有编码都是不兼容的(只有几个日本和其他东亚字符集,以及UTF-16/UCS2 2/UCS2 4/UTF-32样式编码,都是不兼容的。Cp1252,Iso-8859,UTF_8本身,ASCII本身,Cp850和许多其他的都是“ASCII兼容的”,这意味着,100%的ASCII文本是由所有这些编码相同编码的)。
若要将事物转换为u,请在任何unicode网站中查找符号的十六进制值并加以应用。例如,é变成\u00E9
(参见请注意:),☃变为\u2603
(参见unicode雪人)。
将这些转义放在源文件中的非ascii的任何地方,即使您在字符串文本之外看到它:
法定java:
public class Fighter {
public void mêléeAttack() {}
}
但是..。如果将编辑器中的编码设置和maven中的编码设置混为一谈,情况就会很糟糕。然而,这一点:
public class Fighter {
public void m\u00EAl\u00E9eeAttack() {}
}
意味着同样的事情,即使你搞砸了编码也能正常工作。在您的编辑器中,这看起来非常糟糕,这就是为什么这是一个更糟糕的选择。
https://stackoverflow.com/questions/70863742
复制相似问题