我有一个非常简单的代码:
package org;
import java.nio.charset.Charset;
public class Test
{
public static void main(String[] args)
{
System.out.println(Charset.defaultCharset());
}
}
我在Windows7 RUS JRE7上运行它。
当我从 Eclipse 4.2 (20120614-1722) 使用"调试"或"运行"运行它时(我没有为 Eclipse 或项目设置任何其他编码首选项),我得到以下结果:
windows-1252
这对我来说似乎是正确的。
但是当我使用默认设置将其与 ANT 1.8.2 打包到 JAR 中时:
<project name="Test" default="dist" basedir=".">
<description>
Simple build XML
</description>
<!-- set global properties for this build -->
<property name="src" location="src"/>
<property name="build" location="build"/>
<property name="dist" location="dist"/>
<target name="init">
<!-- Create the build directory structure used by compile -->
<delete dir="${build}"/>
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init" description="compile the source" >
<!-- Compile the java code from ${src} into ${build} -->
<javac srcdir="${src}" destdir="${build}" includeantruntime="false"/>
</target>
<target name="dist" depends="compile" description="generate the distribution" >
<!-- Create the distribution directory -->
<delete dir="${dist}"/>
<mkdir dir="${dist}"/>
<!-- Put everything from ${build} into the test.jar file -->
<jar jarfile="${dist}/test.jar" basedir="${build}">
<manifest>
<attribute name="Main-Class" value="org.Test"/>
</manifest>
</jar>
</target>
</project>
运行时得到以下结果:
>java -jar test.jar
windows-1251
我希望在这里得到同样的结果。我做错了什么?那么确定默认字符集的正确方法是什么?
更新:问这个问题的原因是,我并没有真正读取或写入文件,我可以手动指定编码。我只是从中返回了一个字符串 javax.sound.sampled.Mixer.Info.getName()并且需要在不同的系统字符集中正确显示它。
更新2:看来,原因是javax.sound.sampled.Mixer.Info.getName()使用CP1251编码"系统字符集"特定结果,所以我需要将其解码回"系统字符集"。但是如何找出来呢?
答案是永远不应该依赖默认字符编码:
如何在 Java 中找到默认的字符集/编码?
设置默认的 Java 字符编码?
相反,当您写入或读取时,您需要显式指定所需的编码。
例如,应首选第二个构造函数。
InputStreamReader(InputStream in)
InputStreamReader(InputStream in, String charsetName)