我有一个带有字符串String s="P�rsh�ndetje bot�!";
的.java文件。
当我在Notepad++
中打开此文件并将编码更改为ISO-8859-1时,它会显示相应的字符串:"Përshëndetje botë!"
,但如果我在intellij中打开文件并将编码更改为ISO-8859 -1,它告诉我一些符号无法转换的警告,然后用?
标记替换这些符号:"P?rsh?ndetje bot?!"
。
为什么会这样?为什么Notepad ++能够转换文件,而想法不是?
答案 0 :(得分:3)
我不确定,但有可能当你第一次打开文件时它被读作UTF-8而无效的字节序列被转换为robust-pca
code,那么当你尝试转换为ISO时-8859-1它正在尝试转换Unicode替换字符,但在ISO-8859-1中没有值,因此它转换为?
。
(即使像“ërs”这样的文字可以用Unicode表示,因此UTF-8,“ërs”的ISO-8859-1编码是EB
72
73
是三字节UTF-8序列的起始字节,但接下来的两个字节不是连续字节,因此将其视为UTF-8的程序会认为这些重音字符无效。)
我认为您需要让IntelliJ以ISO-8859-1打开该文件,而不是先将其打开为UTF-8,然后尝试转换为ISO-8859-1。
(当您在Notepad ++中切换编码时,它必须返回到文件的原始字节并将它们解释为ISO-8859-1,而不是尝试通过将无效字节更改为已转换的内容来转换它替换字符。)
请注意,ë是完全有效的Unicode字符。它可以表示为U + 00EB,带有分音符的拉丁文小写字母,或者作为两个代码点,U + 0065和U + 0308,拉丁文小写字母e 组合与结合分离。但U + 00EB将以UTF-8编码为双字节序列C3
AB
,而对于U + 0065 U + 0308,“e”将编码为其自身,{{1} },而U + 0308将被编码为65
CC
。
因此,UTF-8中的“ë”必须是88
C3
或AB
65
CC
。它不能是88
。
答案 1 :(得分: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 +键盘
然后在保持按下ALT键的同时将此字符添加为00eb。然后它显示正确: