模块 java.base

类 Charset

java.lang.Object
java.nio.charset.Charset
所有已实现的接口:
Comparable<Charset>

public abstract class Charset extends Object implements Comparable <Charset >
十六位 Unicode 代码单元 序列和字节序列之间的命名映射。此类定义用于创建解码器和编码器以及检索与字符集关联的各种名称的方法。此类的实例是不可变的。

此类还定义了静态方法,用于测试是否支持特定字符集、按名称定位字符集实例以及构建包含当前 Java 虚拟机支持的每个字符集的映射。可以通过 CharsetProvider 类中定义的服务提供者接口添加对新字符集的支持。

此类中定义的所有方法都可以安全地供多个并发线程使用。

字符集名称

字符集由以下字符组成的字符串命名:

  • 大写字母 'A''Z''\u0041''\u005a'),
  • 小写字母 'a''z''\u0061''\u007a'),
  • 数字 '0''9''\u0030''\u0039'),
  • 破折号字符 '-' ('\u002d' ,HYPHEN-MINUS),
  • 加号 '+' ('\u002b' ,PLUS SIGN),
  • 句点字符 '.' ('\u002e' ,FULL STOP),
  • 冒号字符 ':' ('\u003a' ,COLON), 和
  • 下划线字符 '_' ('\u005f' ,LOW LINE).
字符集名称必须以字母或数字开头。空字符串不是合法的字符集名称。字符集名称不区分大小写;也就是说,在比较字符集名称时总是忽略大小写。字符集名称通常遵循 RFC 2278:IANA 字符集注册程序 中记录的约定。

每个字符集都有一个规范名称也可能有一个或多个aliases.规范名称由此类的 name 方法返回。按照惯例,规范名称通常是大写的。 aliases 方法返回字符集的别名。

Some charsets have an historical name that is defined for compatibility with previous versions of the Java platform. 字符集的历史名称是其规范名称或其别名之一。 InputStreamReader OutputStreamWriter 类的 getEncoding() 方法返回历史名称。

如果 IANA 字符集注册表 中列出的字符集受 Java 平台实现的支持,则其规范名称必须是注册表中列出的名称。许多字符集在注册表中被赋予了多个名称,在这种情况下,注册表将其中一个名称标识为MIME 首选.如果一个字符集有多个注册表名称,那么它的规范名称必须是 MIME 首选名称,注册表中的其他名称必须是有效的别名。如果支持的字符集未在 IANA 注册表中列出,则其规范名称必须以字符串 "X-""x-" 之一开头。

IANA 字符集注册表确实会随时间变化,因此特定字符集的规范名称和别名也可能随时间变化。为确保兼容性,建议不要从字符集中删除任何别名,并且如果更改了字符集的规范名称,则将其先前的规范名称设为别名。

标准字符集

Java 平台的每个实现都需要支持以下标准字符集。请查阅您的实现的发布文档以查看是否支持任何其他字符集。此类可选字符集的行为可能因实现而异。

标准字符集的描述
Charset Description
US-ASCII 七位 ASCII,又名 ISO646-US ,又名 Unicode 字符集的基本拉丁语块
ISO-8859-1   ISO 拉丁字母编号 1,又名 ISO-LATIN-1
UTF-8 八位 UCS 转换格式
UTF-16BE 十六位 UCS 转换格式,大端字节顺序
UTF-16LE 十六位 UCS 转换格式,小端字节序
UTF-16 十六位 UCS 转换格式,由可选字节顺序标记标识的字节顺序

UTF-8 字符集由 RFC 2279 指定;它所基于的转换格式在 ISO 10646-1 的修正案 2 中指定,并且也在 Unicode标准 中进行了描述。

UTF-16 字符集由 RFC 2781 指定;它们所基于的转换格式在 ISO 10646-1 的修正案 1 中指定,并且也在 Unicode标准 中进行了描述。

UTF-16 字符集使用 16 位数量,因此对字节顺序敏感。在这些编码中,流的字节顺序可以由一个初始的字节顺序标记由 Unicode 字符 '\uFEFF' 表示。字节顺序标记的处理如下:

  • 解码时,UTF-16BEUTF-16LE 字符集将初始字节顺序标记解释为ZERO-WIDTH NON-BREAKING SPACE;编码时,他们不写字节顺序标记。

  • 解码时,UTF-16字符集解释输入流开头的字节顺序标记,以指示流的字节顺序,但如果没有字节顺序标记,则默认为大端;编码时使用big-endian字节序,写入big-endian字节序标记。

在任何情况下,在输入序列的第一个元素之后出现的字节顺序标记不会被省略,因为相同的代码用于表示ZERO-WIDTH NON-BREAKING SPACE.

Java 虚拟机的每个实例都有一个默认字符集,它可能是也可能不是标准字符集之一。默认字符集是在虚拟机启动期间确定的,通常取决于底层操作系统使用的locale和字符集。

StandardCharsets 类为每个标准字符集定义常量。

术语

此类的名称取自 RFC 2278 中使用的术语。在该文档中charset被定义为一个或多个编码字符集和字符编码方案的组合。 (这个定义很混乱;其他一些软件系统定义charset作为同义词编码字符集.)

A 编码字符集是一组抽象字符和一组整数之间的映射。 US-ASCII、ISO 8859-1、JIS X 0201 和 Unicode 是编码字符集的示例。

一些标准定义了一个字符集只是一组没有相关分配编号的抽象字符。字母表就是这种字符集的一个示例。然而,两者之间的细微差别字符集编码字符集在实践中很少使用;前者已成为后者的缩写形式,包括在 Java API 规范中。

A 字符编码方案是一个或多个编码字符集与一组八位字节(八位字节)序列之间的映射。 UTF-8、UTF-16、ISO 2022 和 EUC 是字符编码方案的示例。编码方案通常与特定的编码字符集相关联;例如,UTF-8 仅用于编码 Unicode。然而,一些方案与多个编码字符集相关联;例如,EUC 可用于对各种亚洲编码字符集中的字符进行编码。

当编码字符集专门用于单一字符编码方案时,相应的字符集通常以编码字符集命名;否则,字符集通常根据编码方案命名,可能还有它支持的编码字符集的区域设置。因此,US-ASCII 既是编码字符集的名称,也是对其进行编码的字符集的名称,而 EUC-JP 是对日语的 JIS X 0201、JIS X 0208 和 JIS X 0212 编码字符集进行编码的字符集的名称。

Java 编程语言的本机字符编码是 UTF-16。因此,Java 平台中的字符集定义了十六位 UTF-16 代码单元序列(即字符序列)和字节序列之间的映射。

自从:
1.4
参见:
  • 构造方法详细信息

    • Charset

      protected Charset(String  canonicalName, String [] aliases)
      使用给定的规范名称和别名集初始化新的字符集。
      参数:
      canonicalName - 此字符集的规范名称
      aliases - 此字符集别名的数组,如果没有别名则为 null
      抛出:
      IllegalCharsetNameException - 如果规范名称或任何别名是非法的
  • 方法详情

    • isSupported

      public static boolean isSupported(String  charsetName)
      告知是否支持指定的字符集。
      参数:
      charsetName - 请求的字符集名称;可以是规范名称或别名
      返回:
      true 当且仅当当前 Java 虚拟机支持命名字符集
      抛出:
      IllegalCharsetNameException - 如果给定的字符集名称是非法的
      IllegalArgumentException - 如果给定的 charsetName 为空
    • forName

      public static Charset  forName(String  charsetName)
      返回指定字符集的字符集对象。
      参数:
      charsetName - 请求的字符集名称;可以是规范名称或别名
      返回:
      命名字符集的字符集对象
      抛出:
      IllegalCharsetNameException - 如果给定的字符集名称是非法的
      IllegalArgumentException - 如果给定的 charsetName 为空
      UnsupportedCharsetException - 如果在此 Java 虚拟机实例中不支持命名字符集
    • availableCharsets

      public static SortedMap <String ,Charset > availableCharsets()
      构造一个从规范字符集名称到字符集对象的排序映射。

      对于当前 Java 虚拟机支持的每个字符集,此方法返回的映射将有一个条目。如果两个或多个受支持的字符集具有相同的规范名称,则生成的映射将仅包含其中一个;未指定它将包含哪一个。

      调用此方法以及随后使用生成的映射可能会导致发生耗时的磁盘或网络 I/O 操作。此方法是为需要枚举所有可用字符集的应用程序提供的,例如允许用户选择字符集。 forName 方法不使用此方法,而是采用高效的增量查找算法。

      如果新的字符集提供程序动态地可用于当前 Java 虚拟机,则此方法可能会在不同的时间返回不同的结果。在没有此类更改的情况下,此方法返回的字符集正是可以通过 forName 方法检索的字符集。

      返回:
      从规范字符集名称到字符集对象的不可变、不区分大小写的映射
    • defaultCharset

      public static Charset  defaultCharset()
      返回此 Java 虚拟机的默认字符集。

      默认字符集是在虚拟机启动期间确定的,通常取决于底层操作系统的区域设置和字符集。

      返回:
      默认字符集的字符集对象
      自从:
      1.5
    • name

      public final String  name()
      返回此字符集的规范名称。
      返回:
      此字符集的规范名称
    • aliases

      public final Set <String > aliases()
      返回包含此字符集别名的集合。
      返回:
      此字符集的别名的一组不可变的
    • displayName

      public String  displayName()
      返回此字符集的默认locale的人类可读名称。

      此方法的默认实现仅返回此字符集的规范名称。此类的具体子类可以重写此方法以提供本地化的显示名称。

      返回:
      此字符集在默认locale中的显示名称
    • isRegistered

      public final boolean isRegistered()
      告知此字符集是否已在 IANA 字符集注册表 中注册。
      返回:
      true 当且仅当其实现者知道此字符集已在 IANA 注册
    • displayName

      public String  displayName(Locale  locale)
      返回给定locale的此字符集的人类可读名称。

      此方法的默认实现仅返回此字符集的规范名称。此类的具体子类可以重写此方法以提供本地化的显示名称。

      参数:
      locale - 要检索其显示名称的locale
      返回:
      此字符集在给定locale中的显示名称
    • contains

      public abstract boolean contains(Charset  cs)
      告知此字符集是否包含给定的字符集。

      字符集C据说包含字符集D当且仅当每个字符在D也可以表示在C.如果这种关系成立,那么可以保证可以编码的每个字符串D也可以编码为C无需执行任何替换。

      CcontainsD并不意味着每个字符都可以表示C由一个特定的字节序列表示D通过相同的字节序列,虽然有时是这种情况。

      每个字符集都包含自己。

      此方法计算包含关系的近似值:如果它返回 true,则已知给定字符集包含在该字符集中;但是,如果它返回 false ,则给定字符集不一定不包含在此字符集中。

      参数:
      cs - 给定的字符集
      返回:
      true 如果给定的字符集包含在此字符集中
    • newDecoder

      public abstract CharsetDecoder  newDecoder()
      为此字符集构造一个新的解码器。
      返回:
      此字符集的新解码器
    • newEncoder

      public abstract CharsetEncoder  newEncoder()
      为此字符集构造一个新的编码器。
      返回:
      此字符集的新编码器
      抛出:
      UnsupportedOperationException - 如果这个字符集不支持编码
    • canEncode

      public boolean canEncode()
      告知此字符集是否支持编码。

      几乎所有的字符集都支持编码。主要异常是特殊用途自动侦测其解码器可以通过检查输入字节序列来确定正在使用几种可能的编码方案中的哪一种的字符集。此类字符集不支持编码,因为无法确定应在输出中使用哪种编码。此类字符集的实现应覆盖此方法以返回 false

      返回:
      true 当且仅当此字符集支持编码
    • decode

      public final CharBuffer  decode(ByteBuffer  bb)
      将此字符集中的字节解码为 Unicode 字符的便捷方法。

      在字符集 cs 上调用此方法返回与表达式相同的结果

         cs.newDecoder()
          .onMalformedInput(CodingErrorAction.REPLACE)
          .onUnmappableCharacter(CodingErrorAction.REPLACE)
          .decode(bb); 
      除了它可能更有效,因为它可以在连续调用之间缓存解码器。

      此方法始终用此字符集的默认替换字节数组替换格式错误的输入和不可映射的字符序列。为了检测这样的序列,直接使用CharsetDecoder.decode(java.nio.ByteBuffer) 方法。

      参数:
      bb - 要解码的字节缓冲区
      返回:
      包含解码字符的字符缓冲区
    • encode

      public final ByteBuffer  encode(CharBuffer  cb)
      在此字符集中将 Unicode 字符编码为字节的便捷方法。

      在字符集 cs 上调用此方法返回与表达式相同的结果

         cs.newEncoder()
          .onMalformedInput(CodingErrorAction.REPLACE)
          .onUnmappableCharacter(CodingErrorAction.REPLACE)
          .encode(bb); 
      除了它可能更有效,因为它可以在连续调用之间缓存编码器。

      此方法始终用此字符集的默认替换字符串替换格式错误的输入和不可映射的字符序列。为了检测这样的序列,直接使用CharsetEncoder.encode(java.nio.CharBuffer) 方法。

      参数:
      cb - 要编码的字符缓冲区
      返回:
      包含编码字符的字节缓冲区
    • encode

      public final ByteBuffer  encode(String  str)
      在此字符集中将字符串编码为字节的便捷方法。

      在字符集 cs 上调用此方法返回与表达式相同的结果

         cs.encode(CharBuffer.wrap(s)); 
      参数:
      str - 要编码的字符串
      返回:
      包含编码字符的字节缓冲区
    • compareTo

      public final int compareTo(Charset  that)
      将此字符集与另一个字符集进行比较。

      字符集按其规范名称排序,不考虑大小写。

      指定者:
      compareTo 在接口 Comparable<Charset>
      参数:
      that - 此字符集要与之比较的字符集
      返回:
      负整数、零或正整数,因为此字符集小于、等于或大于指定的字符集
    • hashCode

      public final int hashCode()
      计算此字符集的哈希码。
      重写:
      hashCode 在类 Object
      返回:
      整数哈希码
      参见:
    • equals

      public final boolean equals(Object  ob)
      告诉这个对象是否等于另一个。

      当且仅当它们具有相同的规范名称时,两个字符集才相等。字符集永远不等于任何其他类型的对象。

      重写:
      equals 在类 Object
      参数:
      ob - 要与之比较的参考对象。
      返回:
      true 当且仅当此字符集等于给定对象
      参见:
    • toString

      public final String  toString()
      返回描述此字符集的字符串。
      重写:
      toString 在类 Object
      返回:
      描述此字符集的字符串