问题:我有一个包含特殊字符的字符串,我将其转换为字节,反之,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。
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
发布于 2010-01-31 00:18:34
您的字符可能正在被编译过程损坏,并且您最终在类文件中得到了垃圾数据。
如果我在linux上使用选项-Dfile.coding=ISO-8859-1运行,它可以正常工作。
简而言之,不要使用-Dfile.encoding=...
String x = "½";由于U+00bd (1/2)将由不同编码中的不同值表示:
windows-1252 BD
UTF-8 C2 BD
ISO-8859-1 BD...you需要告诉你的编译器你的源文件的编码是什么:
javac -encoding ISO-8859-1 Foo.java现在我们来看这个:
System.out.println(x);作为PrintStream,这将在发出字节数据之前将数据编码为系统编码。如下所示:
System.out.write(x.getBytes(Charset.defaultCharset()));这可能会也可能不会像您在some platforms上期望的那样工作-字节编码必须与控制台期望的字符正确显示的编码相匹配。
发布于 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。
发布于 2010-01-30 23:26:16
您应该显式地进行转换:
byte[] byteArray = "abcd".getBytes( "ISO-8859-1" );
new String( byteArray, "ISO-8859-1" );编辑:
似乎问题出在你的java文件的编码上。如果它可以在windows上运行,可以尝试在linux上使用javac -encondig ISO-8859-1编译源文件。这应该可以解决您的问题。
https://stackoverflow.com/questions/2168350
复制相似问题