首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >linux上的Java字符集问题

问linux上的Java字符集问题
EN

Stack Overflow用户
提问于 2010-01-30 23:22:56
回答 3查看 30.6K关注 0票数 11

问题:我有一个包含特殊字符的字符串,我将其转换为字节,反之,versa..the转换在windows上可以正常工作,但在linux上,特殊字符不能转换,在linux上,默认字符集是properly.the -8,如Charset.defaultCharset.getdisplayName()所示

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

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

编辑:我使用jdk1.6.13

编辑:代码片段适用于cs = "ISO-8859-1";或cs="UTF-8";在win上但不适用于linux。

代码语言:javascript
复制
        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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-31 00:18:34

您的字符可能正在被编译过程损坏,并且您最终在类文件中得到了垃圾数据。

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

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=...

代码语言:javascript
复制
    String x = "½";

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

代码语言:javascript
复制
windows-1252     BD
UTF-8            C2 BD
ISO-8859-1       BD

...you需要告诉你的编译器你的源文件的编码是什么:

代码语言:javascript
复制
javac -encoding ISO-8859-1 Foo.java

现在我们来看这个:

代码语言:javascript
复制
    System.out.println(x);

作为PrintStream,这将在发出字节数据之前将数据编码为系统编码。如下所示:

代码语言:javascript
复制
 System.out.write(x.getBytes(Charset.defaultCharset()));

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

票数 10
EN

Stack Overflow用户

发布于 2010-01-30 23:52:25

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

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

(很抱歉,这不适合评论,但如果您提供了有关实际功能需求的更多信息,我将使用答案更新此内容)。

更新:根据评论:您基本上只需要配置标准输出/命令,以便它使用正确的编码来显示这些字符。在Windows中,您可以使用chcp命令来执行此操作,但有一个主要的警告: Windows cmd中使用的标准字体没有正确的字形(实际的字体图片)来处理ISO-8859字符集以外的字符。你可以通过hack the one or other in registry来添加合适的字体。没有关于Linux的措辞,因为我并没有广泛地研究它,但看起来-Dfile.encoding似乎是一条可行的道路。毕竟。我认为最好是用一个跨平台的UI工具来代替cmd,这样就可以按照你想要的方式显示字符,比如Swing。

票数 3
EN

Stack Overflow用户

发布于 2010-01-30 23:26:16

您应该显式地进行转换:

代码语言:javascript
复制
byte[] byteArray = "abcd".getBytes( "ISO-8859-1" );
new String( byteArray, "ISO-8859-1" );

编辑:

似乎问题出在你的java文件的编码上。如果它可以在windows上运行,可以尝试在linux上使用javac -encondig ISO-8859-1编译源文件。这应该可以解决您的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2168350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档