首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Maven将编码更改为特定文件

Maven将编码更改为特定文件
EN

Stack Overflow用户
提问于 2022-01-26 12:53:43
回答 1查看 193关注 0票数 1

我所有的项目都使用Cp1252编码,除了几个我用UTF-8编码的文件,这些文件包含特殊字符。

当我运行安装时,在这些文件中我会得到几个错误:unclosed character literalillegal character: '\u00a8'。在使用UTF8中的编码插件进行安装时:

代码语言:javascript
运行
复制
    <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显示的错误如下:

代码语言:javascript
运行
复制
folder/file.java:[10,19] unclosed character literal
folder/file.java:[10,22] unclosed character literal
folder/file.java:[13,19] unclosed character literal

这些数字意味着什么?它似乎不是错误所在的行号。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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字符(十六进制)。例如,这是:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
public class Fighter {
  public void mêléeAttack() {}
}

但是..。如果将编辑器中的编码设置和maven中的编码设置混为一谈,情况就会很糟糕。然而,这一点:

代码语言:javascript
运行
复制
public class Fighter {
  public void m\u00EAl\u00E9eeAttack() {}
}

意味着同样的事情,即使你搞砸了编码也能正常工作。在您的编辑器中,这看起来非常糟糕,这就是为什么这是一个更糟糕的选择。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70863742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档