我有一个JVM。字符设置为“ -Dfile.encoding = UTF-8”。这就是设置UTF-8的方式。我想将其设置为非Unicode字符集。
是否存在非Unicode字符集的示例/值,以便我可以设置为-Dfile.encoding=
?
答案 0 :(得分:1)
[TLDR => 应用程序编码一个令人困惑的问题,但this document from Oracle should help 。 ]
关于通过在运行时设置系统属性file.encoding
来指定编码的一些重要的一般要点:
它的使用不受正式支持,而且从未得到过支持。 From a Java Bug Report in 1998:
J2SE平台不需要“ file.encoding”属性 规格; 这是Sun实施的内部细节, 不应由用户代码检查或修改。也有意 只读;从技术上讲,不可能支持 将此属性设置为命令行或其他任意值 程序执行期间的时间。
有一个JDK-8187041 Use UTF-8 as default Charset的JEP(JDK增强建议)草案,提议:
使用UTF-8作为Java虚拟机的默认字符集,以便API 取决于默认字符集的行为在所有 平台。
宣称“此应用程序使用编码{x}” 并不一定有意义,因为可能有多个与应用程序相关联的编码,可以用不同的方式解决,包括:
所有这些,Oracle specify all encodings supported by Java SE 8。我找不到最新JDK版本的相应文档。请注意:
java.nio
API与java.io
/ java.lang
API)而有所不同。例如,如果在Windows上的土耳其语文件上执行一些I / O:
java.nio.*
类,请在运行时指定 -Dfile.encoding = windows-1254 。 java.lang.*
和java.io.*
类,请在运行时指定 -Dfile.encoding = Cp1254 。 此DZone article提供了一段有用的代码,以显示在运行时设置 -Dfile.encoding 如何影响各种设置:
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.Locale;
import static java.lang.System.out;
/**
* Demonstrate default Charset-related details.
*/
public class CharsetDemo
{
/**
* Supplies the default encoding without using Charset.defaultCharset()
* and without accessing System.getProperty("file.encoding").
*
* @return Default encoding (default charset).
*/
public static String getEncoding()
{
final byte [] bytes = {'D'};
final InputStream inputStream = new ByteArrayInputStream(bytes);
final InputStreamReader reader = new InputStreamReader(inputStream);
final String encoding = reader.getEncoding();
return encoding;
}
public static void main(final String[] arguments)
{
out.println("Default Locale: " + Locale.getDefault());
out.println("Default Charset: " + Charset.defaultCharset());
out.println("file.encoding; " + System.getProperty("file.encoding"));
out.println("sun.jnu.encoding: " + System.getProperty("sun.jnu.encoding"));
out.println("Default Encoding: " + getEncoding());
}
}
在Windows 10上使用Java 12指定 -Dfile.encoding = 860 ( MS-DOS葡萄牙语的别名)时,以下是一些示例输出:
run:
Default Locale: en_US
Default Charset: IBM860
file.encoding: 860
sun.jnu.encoding: Cp1252
Default Encoding: Cp860
BUILD SUCCESSFUL (total time: 0 seconds)
在所有目标平台上测试您计划在运行时指定的编码。您可能会得到意想不到的结果。例如,当我在Windows 10上使用 -Dfile.encoding = IBM864 ( PC阿拉伯语)运行上面的代码时,它可以工作,但是对 -Dfile.encoding失败= IBM420 ( IBM阿拉伯语)。