java - Maven java项目中文件的源编码

标签 java maven encoding utf-8

我们的 Maven 项目中存储在 Subversion 中的 .java 文件的源编码主要是 ASCII,有些文件是 UTF-8。

我认为目的是这些文件将是 UTF-8。在 pom 文件中,源编码指定为 UTF-8。

现在我们的构建失败了,具体来说,我们的 SonarQube 分析在 ISO-8859 且具有带有特殊字符的变量的 .java 文件上失败。使用特殊字符并不是一个好主意,但除此之外,java 文件不应该具有一致的(UTF-8)编码吗?

或者大多数是 ASCII 而只有一些是 UTF-8 并不重要?重要的是思想吗?

顺便说一句,我不明白这些文件如何以 ASCII 编码结束。当我使用 IDE 或像 SublimeText 这样的编辑器时,文件最终会变成 UTF-8。

只有当我在 MS Windows 上使用记事本时才能得到 ASCII。 Java 开发人员通常不使用它进行编程。

我们应该更改源文件以使用 UTF-8 吗?或者也许这并不重要,我们可以保持原样?

举个例子。使用 MS Windows,我使用 SublimeText 创建一个文件,并使用 Notepad.exe 创建一个文件。我将文本 1234Ï 放入这些文件中。文本包含一个带两个点的特殊字符 I。

当我在 Linux 上使用 file 查看这些文件时

ostraaten@io:/tmp/iconv$ file sublimtext.txt 
sublimtext.txt: UTF-8 Unicode (with BOM) text, with no line terminators
ostraaten@io:/tmp/iconv$ file notepad.txt 
notepad.txt: ISO-8859 text, with no line terminators
ostraaten@io:/tmp/iconv$ 

因此,这表明记事本将文件保存为 ISO-8859,无论内容如何。当我使用 iconv

检查文件时
ostraaten@io:/tmp/iconv$ iconv -f UTF-8 notepad.txt -o /dev/null 
iconv: incomplete character or shift sequence at end of buffer
ostraaten@io:/tmp/iconv$ iconv -f UTF-8 sublimtext.txt -o /dev/null 
ostraaten@io:/tmp/iconv$ 

我可以使用 SublimeText 打开并保存文件 notepad.txt,编码仍然显示为 ISO-8859。

该字符在两个文件中都正确显示。因此,这支持了这样的想法:编辑器尝试从文件内容确定编码。但在其他地方,该文件仍然被标记并识别为 ISO-8859。

我可以使用iconv更改编码

ostraaten@io:/tmp/iconv$ iconv -f ISO-8859-15 -t UTF-8 notepad.txt > notepad-utf8.txt
ostraaten@io:/tmp/iconv$ file notepad-utf8.txt 
notepad-utf8.txt: UTF-8 Unicode text, with no line terminators
ostraaten@io:/tmp/iconv$ 
straaten@io:/tmp/iconv$ iconv -f UTF-8 notepad-utf8.txt -o /dev/null

转换成功,因为消息不完整的字符消失了。

最佳答案

七位 ASCII 是 UTF-8 的子集。 ISO-8859-1 是 Latin 1,带有一些 8 位有问题的字节。

因此有人使用编辑器或 IDE 来解决 UTF-8 问题。某些版本控制 checkin 将文本替换回源代码,但在您的情况下似乎并非如此。

UTF-8 是一个可靠的选择,但需要注意。

关于java - Maven java项目中文件的源编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41244903/

相关文章:

JavaFX 按钮栏布局 - 方向和空间分布

java - 为什么 war :exploded make no difference to the output of my Maven build?

r - 调查编码错误

r - 将特殊字符从 R 导出到 excel/csv

java - 无法在服务中接收用户区域设置

java - 为什么 EventDispatchThread 排在第一位?

maven - 在 Jenkins 管道 Groovy 脚本中访问 Maven 元数据插件参数?

java - java中如何将Base64编码的字符串转换为UUID

java - 如何在没有文档的情况下分析和使用 Android 项目?

java - Archiva/Maven 作为企业存储库