更改IntelliJ IDEA编码无效。

3

我有一个包含字符串String s="P�rsh�ndetje bot�!";的.java文件。

当我在Notepad++中打开此文件并将编码更改为ISO-8859-1时,它显示适当的字符串:"Përshëndetje botë!",但是如果我在idea intellij中打开文件并将编码更改为ISO-8859-1,它会给出一个警告,说明某些符号无法转换,然后用?标记替换这些符号:"P?rsh?ndetje bot?!"

为什么会发生这种情况?为什么Notepad++能够转换文件,而idea不能呢?


2
为什么不直接使用UTF-8呢?也许Intellij与您选择的编码存在问题? - buræquete
1
你使用文件 > 文件编码 > ISO-8859-1 > 转换吗? 按照这些步骤,我在我的IntelliJ上没有遇到任何问题。 - buræquete
1
我不确定,但有可能当您首次打开文件时,它被读取为UTF-8,并且无效的字节序列被转换为Unicode替换字符,然后当您尝试转换为ISO-8859-1时,它会尝试转换Unicode替换字符,但是在ISO-8859-1中没有该值,因此会转换为? - David Conrad
1
我认为你需要让IntelliJ以ISO-8859-1格式打开文件,而不是先以UTF-8格式打开文件,然后尝试转换为ISO-8859-1格式。 - David Conrad
1
@David Conra,谢谢,看起来这个可以工作了。我试图在主项目之外打开文件并进行转换,成功了!然后我发现只要在出现那两个警告时单击“重新加载”就行了。感谢您和bureaquete的时间。 - parsecer
显示剩余9条评论
2个回答

3
我不确定,但有可能当您第一次打开文件时,它是以UTF-8格式读取的,并且无效的字节序列被转换成了Unicode替换字符,然后当您尝试转换为ISO-8859-1格式时,它尝试转换Unicode替换字符,但ISO-8859-1中没有该值,因此会被转换为?

(即使像“ërs”这样的文本可以用Unicode和UTF-8表示,但“ërs”的ISO-8859-1编码是EB7273,这是一个三个字节的UTF-8序列的起始字节,但下两个字节不是连续字节,所以将其视为UTF-8的程序会认为这些重音字符是无效的。)

我认为您需要让IntelliJ将文件作为ISO-8859-1打开,而不是先以UTF-8格式打开,然后尝试转换为ISO-8859-1。

(当您在Notepad++中切换编码时,它必须返回文件的原始字节,并将其解释为ISO-8859-1,而不是尝试转换已经通过更改无效字节而更改内容的内容到替换字符。)

请注意,ë是一个完全有效的Unicode字符。它可以表示为U+00EB,“带分音符的小写拉丁字母e”或两个代码点U+0065和U+0308,“小写拉丁字母e”与“组合分音符”的组合。但U+00EB在UTF-8中编码为两个字节的序列C3AB,而对于U+0065 U+0308,“e”将作为本身编码为65,U+0308将被编码为CC88

因此,“ë”在UTF-8中必须是C3AB65CC88。它不能是EB


请你解释一下,当我把文件转回UTF-8格式时,为什么 ë 字符就不会再次被替换成问号了呢?如果在UTF-8中没有 ë 字符,那这是怎么做到的呢?还有,为什么Intellij的输出窗口能够正确显示这些字符,输出不应该是以UTF-8编码吗? - parsecer
UTF-8 中有一个 ë,但不能像 ISO-8859-1 中一样编码为单个字节。我已经更新了答案,解释了两种正确表示 ë 的 UTF-8 方式。 - David Conrad
谢谢...但是这是怎么发生的?我的意思是,ISO-8859-1-->UTF-8(当文件第一次被打开时)会损坏ë,然后当文件重新加载为ISO-8859-1时,同样的情况出现:ISO-8859-1-->UTF-8完全正常。 - parsecer
我不确定IntelliJ到底发生了什么,但正如我所说,似乎在打开它时它并没有将其转换,而只是将其解释为一个带有一些无效字节序列的UTF-8文件。因此,在第一次打开文件时,它并没有执行ISO-8859-1-->UTF-8的操作,而只是执行了UTF-8--嘿,这不是有效的UTF-8! - David Conrad

2
我认为在IDEA(默认编码为UTF-8)中存在一些错误。当您将包含有效ISO-8859-1编码字符的文件转换并更改文件编码为ISO-8859-1时,它会出现问题。它破坏的特定代码点是ë。由于某种原因,它将其替换为\ufffd,而其正确的代码点是\u00eb。这是在编辑器中显示为�的字符。
我的建议是只使用UTF-8,不要将其更改为ISO-8859-1。UTF-8向后兼容ISO-8859-1,您可以使用操作系统上的IME(似乎是Windows)编写此字符串。我不确定如何在Windows上执行此操作,但在Mac上,我使用U+键盘 enter image description here 然后在按住ALT键的同时添加此字符作为00eb。然后它就能正确显示: enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接