Linux上的Java Charset问题

Inv*_*r53 11 java character-encoding file-encodings

问题:我有一个包含特殊字符的字符串,我将其转换为字节,反之亦然..转换在Windows上正常工作但在linux上特殊字符未正确转换.在Linux上的默认字符集是使用Charset看到的UTF-8. 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);
Run Code Online (Sandbox Code Playgroud)

〜关于黛德

McD*_*ell 10

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

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

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

简而言之,不要使用-Dfile.encoding = ...

    String x = "½";
Run Code Online (Sandbox Code Playgroud)

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

windows-1252     BD
UTF-8            C2 BD
ISO-8859-1       BD
Run Code Online (Sandbox Code Playgroud)

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

javac -encoding ISO-8859-1 Foo.java
Run Code Online (Sandbox Code Playgroud)

现在我们来看看这个:

    System.out.println(x);
Run Code Online (Sandbox Code Playgroud)

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

 System.out.write(x.getBytes(Charset.defaultCharset()));
Run Code Online (Sandbox Code Playgroud)

这可能会或可能不会像您期望的那样在某些平台运行 - 字节编码必须与控制台期望字符正确显示的编码相匹配.