【问题标题】:Changing encoding in idea intellij doesn't work在idea intellij中更改编码不起作用
【发布时间】:2017-02-25 01:30:13
【问题描述】:

我有一个带有字符串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不行?

【问题讨论】:

  • 为什么不直接使用UTF-8呢?也许 Intellij 对您选择的编码有问题?
  • 你使用文件 > 文件编码 > ISO-8859-1 > 转换?通过这些步骤,我的 intellij 没有问题
  • 我不确定,但有可能当你第一次打开文件时它被读取为 UTF-8 并且无效的字节序列变成了Unicode replacement character,然后当你尝试转换为 ISO-8859-1 它正在尝试转换 Unicode 替换字符,但在 ISO-8859-1 中没有任何值,因此它被转换为 ?
  • 我认为您需要让 IntelliJ 以 ISO-8859-1 格式打开文件,而不是先以 UTF-8 格式打开它然后尝试 convert 符合 ISO-8859-1。
  • @David Conra,谢谢,看起来这行得通。我试图在主项目之外打开文件并且转换成功了!然后我想当这两个警告出现时点击“重新加载”就可以了。感谢您和 buraquete 抽出宝贵时间。

标签: java intellij-idea encoding notepad++


【解决方案1】:

我不确定,但有可能当你第一次打开文件时它被读取为 UTF-8 并且无效的字节序列被转换为Unicode replacement character,然后当你尝试转换为 ISO-8859 -1 它正在尝试转换 Unicode 替换字符,但在 ISO-8859-1 中没有值,因此它被转换为 ?

(尽管像“ërs”这样的文本可以用Unicode表示,因此可以用UTF-8表示,“ërs”的ISO-8859-1编码是EB7273,它是a的开始字节三字节 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 中的“ë”必须是 C3 AB65 CC 88。不能是EB

【讨论】:

  • 您能否解释一下为什么当我将文件转换回 UTF-8 时,ë 字符不会再次被问号替换?如果 UTF-8 中没有 ë,这怎么可能?还有为什么Intellij的输出窗口能正确显示字符,输出的不是用UTF-8编码的吗?
  • UTF-8 中有一个ë,它只是不能像 ISO-8859-1 中那样被编码为单个字节。我更新了答案,解释了ë 可以在 UTF-8 中正确表示的两种方式。
  • 谢谢...但是这是怎么回事?我的意思是,ISO-8859-1-->UTF-8(第一次打开文件时)会损坏ë,然后当文件重新加载为 ISO-8859-1 时,同样的事情:ISO-8859- 1-->UTF-8 工作得很好...
  • 我不知道 IntelliJ 到底发生了什么,但正如我所说,似乎在打开它时它并没有转换它,而只是将它解释为带有一些无效字节序列的 UTF-8 文件在里面。所以第一次打开文件时它没有执行 ISO-8859-1-->UTF-8 。它只是在做 UTF-8——嘿,这不是有效的 UTF-8!
【解决方案2】:

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

我的建议是只使用 UTF-8 而不是将其更改为 ISO-8859-1。 UTF-8 与 ISO-8859-1 向后兼容,您可以使用操作系统(似乎是 Windows)上的 IME 编写此字符串。我不确定如何在 Windows 上执行此操作,但在 Mac 上,我使用 U+ 键盘

然后在按住 ALT 键的同时将此字符添加为 00eb。然后它正确显示:

【讨论】:

    猜你喜欢
    • 2014-10-20
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 2011-06-30
    • 2021-10-28
    相关资源
    最近更新 更多