0

我有一个 JVM。其中字符集为 "-Dfile.encoding=UTF-8" 。这就是 UTF-8 的设置方式。我想将其设置为非 Unicode 字符集。

是否有非 unicode 字符集的示例/值以便我可以设置为-Dfile.encoding=

4

1 回答 1

1

[ TLDR =>应用程序编码是一个令人困惑的问题,但来自 Oracle 的这份文档应该会有所帮助。]

file.encoding首先是关于通过在运行时设置系统属性来指定编码的一些重要的一般要点:

  • 它的使用没有得到正式支持,也从来没有得到支持。来自 1998 年的 Java 错误报告

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

  • 有一个草案 JEP (JDK Enhancement Proposal),JDK-8187041 Use UTF-8 as default Charset,它提出:

    使用 UTF-8 作为 Java 虚拟机的默认字符集,以便依赖于默认字符集的 API 在所有平台上的行为一致。

  • 声称“此应用程序使用编码 {x}”不一定有意义,因为可能有多个与应用程序相关联的编码,可以通过不同方式解决,包括:

    • 控制台输出的文件编码。
    • 应用程序源文件的文件编码。
    • 文件 I/O 的文件编码。
    • 文件路径的文件编码。

尽管如此,Oracle指定了 Java SE 8 支持的所有编码。我找不到更新的 JDK 版本的相应文档。注意:

  • 编码可以是特定于环境的,基于语言环境、操作系统、Java 版本等。
  • 几乎每一种编码都有至少一个别名。例如,简体中文的编码名称是GBK,但您也可以使用CP936windows-936
  • 大多数编码都是非 Unicode,因为 Unicode 编码名称包含字符串“UTF”。
  • 编码名称可能因应用程序处理文件的方式而异(java.nioAPIs vs. java.io/ java.langAPIs.)。例如,如果在 Windows 上对土耳其语文件执行一些 I/O:
    • 如果使用java.nio.*类,请在运行时指定-Dfile.encoding=windows-1254
    • 如果使用java.lang.*&java.io.*类,请在运行时指定-Dfile.encoding=Cp1254

这篇DZone 文章提供了一段有用的代码来展示在运行时设置-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=860MS-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)

在所有目标平台上测试您计划在运行时指定的编码。你可能会得到意想不到的结果。例如,当我使用-Dfile.encoding=IBM864 ( PC Arabic ) 在 Windows 10 上运行上面的代码时,它可以工作,但使用-Dfile.encoding=IBM420 ( IBM Arabic ) 失败。

于 2019-05-08T17:36:13.730 回答