-Dfile.encoding =的非Unicode字符集的示例是什么?

时间:2019-05-07 17:51:14

标签: unicode utf-8 character-encoding non-unicode

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

是否存在非Unicode字符集的示例/值,以便我可以设置为-Dfile.encoding=

1 个答案:

答案 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}” 并不一定有意义,因为可能有多个与应用程序相关联的编码,可以用不同的方式解决,包括:

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

所有这些,Oracle specify all encodings supported by Java SE 8。我找不到最新JDK版本的相应文档。请注意:

  • 编码可以是特定于环境的,基于语言环境,操作系统,Java版本等。
  • 几乎每种编码都有至少一个别名。例如,简体中文的编码名称为 GBK ,但是您也可以使用 CP936 windows-936
  • 大多数编码都是非Unicode的,因为Unicode编码名称包含字符串“ UTF”。
  • 编码名称可以根据应用程序处理文件的方式(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阿拉伯语)。