g++默认字符集utf-8_Java可能使用UTF-8作为其默认字符集

g++默认字符集utf-8

由于基于Java的应用程序通常用于各种各样的操作系统和环境中,因此Java开发人员会遇到与基于字符的输入和输出有关的问题并不少见。 涉及这些问题的博客文章包括《警察的恐怖:默认语言环境,默认字符集和默认时区》注释JDK默认数据 ; 编码问题:适用于linux和Java应用程序的解决方案愚蠢的Java字符串 ; Java:字符编码的粗略指南这个帖子标题太长了,不能在这里列出

多年来,对Java进行了一些增强,以减少这些问题,但是当隐式使用默认字符集时,有时仍然存在一些问题。 《 Java Puzzlers 》一书的一个难题(难题18)描述了与Java中“默认字符集的变量”有关的古怪之处。

由于所有这些与Java的默认字符集有关的问题,欢迎 JEP 草案使用UTF-8作为默认字符集 ”( JDK-8187041 )出现。 除了潜在地解决与默认字符集有关的问题外,该JEP还提供了有关这些问题是什么的很好的概述以及解决这些问题的替代方案。 JEP的“动机”部分目前总结了该JEP为何重要的原因:“使用默认字符集的API对Java平台的新开发人员来说是一种危害”,“对于经验丰富的开发人员来说,也是一个麻烦。”

“默认”字符集的问题由于使用不同的字符集以及JDK API中当前可用的不同方法(导致多个“默认”)而变得更加复杂。 这是要考虑的问题的细分。

  • 描述文件内容字符集的“默认”字符集可能与描述文件路径字符集的“默认”字符集不同。
  • 与用于读取/写入文件内容的字符集有关的“默认”有两种类型。
    • 某些JDK方法不允许指定字符集,并且始终仅针对该特定方法且不考虑任何语言环境或系统配置,都采用UTF-8的“默认”字符集。

JEP 草案使用UTF-8作为默认字符集 ”将有助于解决与默认用于读取和写入文件内容的字符集有关的不同类型“默认”的问题。 例如,它将消除使用平台默认方法写入文件并从始终使用UTF-8的方法读取文件(无论平台默认字符集如何)时可能引起的潜在冲突。 当然,如果平台默认值不是NOT UTF-8,那么这只是在特定情况下的问题。

以下Java代码是一个简单的类,可打印出一些与字符集相关的设置。

显示默认字符集详细信息

package dustin.examples.charset;

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的笔记本电脑上运行此简单类的结果,而未明确指定任何与字符集相关的系统属性,仅指定了file.encoding系统属性,并指定了两个系统属性file.encodingsun.jnu.encoding

刚刚显示的图像演示了通过属性控制默认字符集的能力。 它还说明,对于具有en_US 区域设置的Windows环境,文件内容和文件路径的默认字符集均为Windows-1252Cp1252 )。 如果实现了本文中讨论JEP草案 ,则即使对于Windows,文件内容的默认字符集也将更改为UTF-8。

当默认字符集更改为UTF-8时,在某些应用程序中可能会造成重大破坏。 JEP草案讨论了减轻此风险的方法,其中包括通过预先将系统属性file.encoding预先设置为UTF-8来早期测试应用程序对更改的敏感性。 对于需要保留当前行为的情况(使用系统确定的默认字符集而不是始终使用UTF-8),JEP草案的当前版本建议支持指定-Dfile.encoding=SYSTEM

JEP当前处于草稿中,并且与任何特定的JDK版本都不相关。 但是,根据JDK邮件列表上的最新帖子 ,我很乐观地认为,在不久的将来,我们会将UTF-8视为JDK未来版本中的默认字符集。

翻译自: https://www.javacodegeeks.com/2018/02/java-may-use-utf-8-default-charset.html

g++默认字符集utf-8

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值