12

问题:我有一个包含特殊字符的字符串,我将其转换为字节,反之亦然。转换在 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

4

3 回答 3

10

您的角色可能已被编译过程损坏,并且您的类文件中最终会出现垃圾数据。

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

J2SE 平台规范不需要“file.encoding”属性;它是 Sun 实现的内部细节,不应由用户代码检查或修改。它也是只读的;技术上不可能支持在命令行上或在程序执行期间的任何其他时间将此属性设置为任意值。

简而言之,不要使用 -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()));

在某些平台上,这可能会也可能不会像您期望的那样工作- 字节编码必须与控制台期望的编码相匹配才能正确显示字符。

于 2010-01-30T16:18:33.680 回答
3

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

也就是说,您为什么要将字符来回转换为字节?我没有看到任何有用的商业目的。

(抱歉,这不适合评论,但如果您提供了有关实际功能要求的更多信息,我会用答案更新它)。

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

于 2010-01-30T15:52:25.443 回答
1

您应该明确地进行转换:

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

编辑:

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

于 2010-01-30T15:26:16.403 回答