iso-8859-1字符编码在linux下不工作

wmomyfyw  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(546)

我在windows中尝试了下面的代码,并且能够解码消息。但是当我尝试linux时,同样的代码不起作用。

String message ="ööööö";
String encodedMsg = new String(message.getBytes("ISO-8859-1"), "UTF-8");
System.out.println(encodedMsg);

我已经验证过,并且可以看到linux平台中的默认字符集是utf-8(charset.defaultcharset().name())
请建议我如何做同样的编码linux平台。

du7egjpx

du7egjpx1#

首先,我不确定你到底在期待什么…你对“编码”这个词的使用有点混乱,但从你的评论来看,似乎与输入ã¶ã¶ã¶ã¶ã¶", 你期待着结果”ööööö".
在linux和OSX上使用Java1.8,我确实得到了这个结果。我没有windows机器可以试穿。
正如@pshemo所指出的,由于您的输入在源代码中是以字符串形式硬编码的,所以它可能被表示为utf-8,而不是iso-8859-1。实际上,这正是我所期望的,我很惊讶代码能像你期望的那样工作。
尝试使用string.encode()创建输入,编码为iso-8859-1。

9jyewag0

9jyewag02#

对此的解释是,几乎总是在某些地方字节变成了字符,或者在没有明确指定编码的地方字符变成了字节,因此,默认为“平台默认值”,因此,根据您在哪个平台上运行它,会导致不同的结果。
除了在代码片段中显式指定编码的每个地方,将字节转换为字符或将字符转换为字节。
还是真的? String message ="ööööö"; 啊,不,你忘了一个地方:javac本身。你可以编译这个代码。这将是原始字节的位置(因为编译器正在查看 ManmohansSourceFile.java ,这是一个文件,它不是字符,而是一堆字节),它被转换成字符(因为java编译器处理字符),这是使用一些编码完成的。如果你不使用 -encoding 运行时切换 javac (或是maven或gradle在跑步 javac ,它会传递一个编码(这取决于pom/gradle文件),然后使用系统编码读入,从而知道字符串是否真的包含这些字节——谁知道呢。
这很可能是你问题的根源。
修复?选择一个:
不要把非ascii码放在源文件中。请注意,您可以将unicode符号“拉丁文大写字母a with tilde”写成 \u00C3 在源文件中而不是作为 Ã . 然后使用 \u00B6 为了¶.

String message ="\u00C3\u00B6\u00C3\u00B6\u00C3\u00B6\u00C3\u00B6\u00C3\u00B6";
String encodedMsg = new String(message.getBytes("ISO-8859-1"), "UTF-8");
System.out.println(encodedMsg);
> ööööö

确保指定正确的 -encoding 编译时切换。所以,如果你的文本编辑器 String message = "¶"; )配置为“utf-8”,然后运行 javac -encoding UTF-8 manMohansFile.java .

相关问题