Linux上的Java Charset问题

时间:2010-01-30 15:22:56

标签: java character-encoding file-encodings

问题:我有一个包含特殊字符的字符串,我转换为字节,反之亦然..转换在Windows上正常工作但在linux上特殊字符未正确转换。在linux上的默认字符集是UTF-8与Charset.defaultCharset.getdisplayName()

但是如果我使用选项-Dfile.encoding = ISO-8859-1在linux上运行它可以正常工作..

如何使用UTF-8默认字符集使其工作,而不在unix环境中设置-D选项。

编辑:我使用jdk1.6.13

编辑:代码段 适用于cs =“ISO-8859-1”;或者cs =“UTF-8”;在胜利但不在Linux

        String x = "½";
        System.out.println(x);
        byte[] ba = x.getBytes(Charset.forName(cs));
        for (byte b : ba) {
            System.out.println(b);
        }
        String y = new String(ba, Charset.forName(cs));
        System.out.println(y);

〜问候 DAED

3 个答案:

答案 0 :(得分:10)

你的角色可能已被编译过程破坏,你最终会在你的类文件中找到垃圾数据。

  

如果我使用选项-Dfile.encoding = ISO-8859-1在linux上运行它可以正常工作..

The "file.encoding" property is not required by the J2SE platform specification; it's an internal detail of Sun's implementations and should not be examined or modified by user code. It's also intended to be read-only; it's technically impossible to support the setting of this property to arbitrary values on the command line or at any other time during program execution.

简而言之,请勿使用-Dfile.encoding = ...

    String x = "½";

由于U + 00bd(½)将由不同编码中的不同值表示:

windows-1252     BD
UTF-8            C2 BD
ISO-8859-1       BD

...您需要告诉编译器您的源文件编码为:

javac -encoding ISO-8859-1 Foo.java

现在我们来看看这个:

    System.out.println(x);

作为PrintStream,这将在发出字节数据之前将数据编码为系统编码。像这样:

 System.out.write(x.getBytes(Charset.defaultCharset()));

some platforms上可能会或可能不会如您所期望的那样工作 - 字节编码必须与控制台期望字符正确显示的编码相匹配。

答案 1 :(得分:3)

你的问题有点模糊。您提到-Dfile.encoding解决了您的linux问题,但事实上这只是用于通知Sun(!)JVM哪个编码用于管理本地磁盘文件系统中的文件名/路径名。而且......这不符合您实际给出的问题描述:“将字符转换为字节并返回字符失败”。我没有看到-Dfile.encoding与此有什么关系。故事中必须有更多内容。你怎么断定它失败了?您是否从路径名/文件名中读取/写入了这些字符?或者你是否可以打印到标准输出? stdout 本身是否使用了正确的编码?

那就是说,为什么要将字符转换为字节后转换?我认为没有任何有用的商业目的。

(对不起,这不符合评论,但如果您提供了有关实际功能要求的更多信息,我会更新此答案。)

根据评论

更新:您基本上只需要配置stdout / cmd,以便它使用正确的编码来显示这些字符。在Windows中,您可以使用chcp命令执行此操作,但有一个主要警告:Windows cmd中使用的标准字体没有ISO-8859字符集之外的字符的正确字形(实际字体图片)。您可以hack the one or other in registry添加正确的字体。没有关于Linux的措辞,因为我没有广泛地做,但看起来-Dfile.encoding在某种程度上是要走的路。毕竟...我认为最好用跨平台UI工具替换cmd,以便按照您想要的方式显示字符,例如Swing

答案 2 :(得分:1)

您应该明确进行转换:

byte[] byteArray = "abcd".getBytes( "ISO-8859-1" );
new String( byteArray, "ISO-8859-1" );

修改

似乎问题是你的java文件的编码。如果它适用于Windows,请尝试使用javac -encondig ISO-8859-1在Linux上编译源文件。这应该可以解决你的问题。