2017-02-25 1587 views
1

我有一个带有字符串String s="P�rsh�ndetje bot�!";的.java文件。在idea intellij中更改编码不起作用

当我打开Notepad++此文件并更改编码为ISO-8859-1它表明相应的字符串:"Përshëndetje botë!",但如果我打开思路的IntelliJ和变化编码为ISO-8859-1的文件,它给了我一个警告如何不能转换某些符号,然后用? mark:"P?rsh?ndetje bot?!"替换那些符号。

这是怎么发生的?为什么Notepad ++能够转换文件,而想法不是?

+2

为什么不直接使用UTF-8?也许Intellij与您选择的编码有问题? –

+0

@bureaquete,UTF-8不能使用此文件。 Notepad ++和Intellij都具有默认的UTF-8,并且要显示的字符需要更改。 – parsecer

+1

你使用文件>文件编码> ISO-8859-1>转换吗? 通过这些步骤,我的intellij –

回答

1

我相信在IDEA(默认编码为UTF-8)中存在一些错误,因为当您转换包含有效ISO-8859-1编码字符的文件并将文件编码更改为ISO-8859-1它会把它弄糟。它弄糟的特定代码点是ë。由于某种原因,它用\ufffd代替它,而其正确的代码点是\u00eb。这是在你的编辑器中显示为character的字符。

我的建议是只使用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

3

我不知道,但有可能的是,当你第一次打开文件时,它读成UTF-8和无效字节序列变成了Unicode replacement character,那么当您尝试转换为ISO-8859-1时,它会尝试转换Unicode替换字符,但在ISO-8859-1中没有该值,因此将其转换为?

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

我认为您需要将IntelliJ打开为ISO-8859 -1,而不是先打开它作为UTF-8,然后尝试转换为ISO-8859-1。 (当您在Notepad ++中切换编码时,它必须返回到文件的原始字节并将它们解释为ISO-8859-1,而不是试图通过将无效字节更改为已更改的内容转换为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

所以 “E” 在UTF-8必须是C3AB65CC88。它不能是EB

+0

你能解释一下为什么当我将文件转换回UTF-8时,'ë'字符不会再被问号替换吗?如果在UTF-8中没有'''''',那怎么可能? 为什么Intellij的输出窗口正确显示字符,是不是输出用UTF-8编码? – parsecer

+0

UTF-8中有一个'ë',它不能像ISO-8859-1那样被编码为单个字节。我已经更新了答案,并解释了两种方法''可以用UTF-8正确表示。 –

+0

谢谢......但这是怎么发生的?我的意思是,ISO-8859-1 - > UTF-8(当文件第一次打开时)会损坏'''',然后当文件重新加载为ISO-8859-1:ISO-8859- 1 - > UTF-8正常工作... – parsecer