Module  java.base
软件包  java.nio.charset

Class Charset

  • All Implemented Interfaces:
    Comparable<Charset>


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

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

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

    字符串名称

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

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

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

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

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

    IANA字符集注册表确实随时间而变化,因此特定字符集的规范名称和别名也可能随时间而变化。 为确保兼容性,建议不要从字符集中删除任何别名,如果字符集的规范名称被更改,那么其以前的规范名称将被做成一个别名。

    标准字符集

    Every implementation of the Java platform is required to support the following standard charsets.请参阅实现的发行文档,以查看是否支持其他字符集。 这种可选字符集的行为在实现之间可能不同。

    Description of standard charsets
    Charset 描述
    US-ASCII Seven-bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the Unicode character set
    ISO-8859-1   ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1
    UTF-8 Eight-bit UCS Transformation Format
    UTF-16BE Sixteen-bit UCS Transformation Format, big-endian byte order
    UTF-16LE Sixteen-bit UCS Transformation Format, little-endian byte order
    UTF-16 Sixteen-bit UCS Transformation Format, byte order identified by an optional byte-order mark

    UTF-8字符集由RFC 2279指定; 其所依据的转换格式在ISO 10646-1的修正案2中规定,并在Unicode Standard中进行了说明

    UTF-16字符集由RFC 2781指定; 它们所依据的转换格式在ISO 10646-1的修正案1中规定,并在Unicode Standard中进行了描述

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

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

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

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

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

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

    术语

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

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

    一些标准将字符集定义为简单的一组抽象字符,而没有相关的分配编号。 字母表是这样的字符集的示例。 然而, 字符集编码字符集之间的微妙区别在实践中很少使用; 前者已经成为后者的缩写,包括Java API规范。

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

    当编码字符集专用于单个字符编码方案时,相应的字符集通常被命名为编码字符集; 否则字符集通常被命名为编码方案,并且可能是其支持的编码字符集的区域设置。 因此, US-ASCII既是编码字符集的名称,也是编码字符集的名称,而EUC-JP是编码EUC-JP的JIS X 0201,JIS X 0208和JIS X 0212编码字符集的字符集的名称。

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

    从以下版本开始:
    1.4
    另请参见:
    CharsetDecoderCharsetEncoderCharsetProviderCharacter
    • 构造方法详细信息

      • 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)
        返回名为charset的charset对象。
        参数
        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​()
        返回此字符集的默认语言环境的可读名称。

        这个方法的默认实现只是返回这个charset的规范名称。 此类的具体子类可以覆盖此方法,以提供本地化显示名称。

        结果
        默认语言环境中此字符集的显示名称
      • isRegistered

        public final boolean isRegistered​()
        告知这个字符集是否在 IANA Charset Registry中注册。
        结果
        true如果并且只有这个字符集被其实现者知道才能在IANA注册
      • displayName

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

        这个方法的默认实现只是返回这个charset的规范名称。 此类的具体子类可以覆盖此方法,以提供本地化显示名称。

        参数
        locale - 要检索显示名称的区域设置
        结果
        此字符集在给定语言环境中的显示名称
      • contains

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

        据说C字符集包含一个字符集D,如果只有在D中表示的每个字符也可以在C中表示。 如果这种关系成立,那么可以保证在D中编码的每个字符串也可以在C中进行编码,而不进行任何替换。

        C包含D并不意味着通过特定字节序列在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 - 要解码的字节缓冲区
        结果
        包含解码字符的char缓冲区
      • 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 - 要编码的char缓冲区
        结果
        包含编码字符的字节缓冲区
      • encode

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

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

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

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

        字符串按其规范名称排序,不考虑案例。

        Specified by:
        compareTo在接口 Comparable<Charset>
        参数
        that - 要比较此字符集的字符集
        结果
        负整数,零或正整数,因为此字符集小于,等于或大于指定的字符集
      • equals

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

        两个字符串是相等的,只有当他们有相同的规范名称。 字符集从不等于任何其他类型的对象。

        重写:
        equalsObject
        参数
        ob - 与之比较的参考对象。
        结果
        true如果,并且只有当这个字符集等于给定的对象
        另请参见:
        Object.hashCode()HashMap
      • toString

        public final String toString​()
        返回描述此字符集的字符串。
        重写:
        toStringObject
        结果
        A string describing this charset