模块  java.base
软件包  java.nio.charset

Class Charset

  • 实现的所有接口
    Comparable<Charset>

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

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

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

    Charset的名字

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

    • 大写字母'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. charset的历史名称是其规范名称或其别名之一。 历史名称由InputStreamReaderOutputStreamWriter类的getEncoding()方法返回。

    如果Java平台的实现支持IANA Charset Registry列出的字符集,则其规范名称必须是注册表中列出的名称。 许多字符集在注册表中被赋予多个名称,在这种情况下,注册表将其中一个名称标识为MIME首选 如果charset具有多个注册表名称,则其规范名称必须是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字符集使用16位数量,因此对字节顺序敏感。 在这些编码中,流的字节顺序可以由Unicode字符'\uFEFF'表示的初始字节顺序标记 '\uFEFF' 字节顺序标记按如下方式处理:

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

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

    在任何情况下,不会省略在输入序列的第一个元素之后出现的字节顺序标记,因为相同的代码用于表示零宽度非破坏空间

    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是编码EUC-JP的JIS X 0201,JIS X 0208和JIS X 0212编码字符集的字符集的名称。

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

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

      • Charset

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

      • isSupported

        public static boolean isSupported​(String charsetName)
        判断是否支持命名的charset。
        参数
        charsetName - 请求的字符集的名称; 可以是规范名称或别名
        结果
        true当且仅当支持指定的charset在当前Java虚拟机中可用时
        异常
        IllegalCharsetNameException - 如果给定的字符集名称是非法的
        IllegalArgumentException - 如果给定的 charsetName为空
      • forName

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

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

        此方法返回的映射将为每个charset提供一个条目,在当前Java虚拟机中可以获得支持。 如果两个或多个支持的字符集具有相同的规范名称,则生成的映射将仅包含其中一个; 它未包含哪一个。

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

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

        结果
        从规范字符集名称到字符集对象的不可变,不区分大小写的映射
      • defaultCharset

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

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

        结果
        默认字符集的charset对象
        从以下版本开始:
        1.5
      • name

        public final String name()
        返回此charset的规范名称。
        结果
        这个charset的规范名称
      • aliases

        public final Set<String> aliases()
        返回包含此charset的别名的集合。
        结果
        这个charset的别名的一组不可变的
      • displayName

        public String displayName()
        返回此charset的默认语言环境的可读名称。

        此方法的默认实现只返回此charset的规范名称。 此类的具体子类可以重写此方法,以便提供本地化的显示名称。

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

        public final boolean isRegistered()
        告知此charset是否已在 IANA Charset Registry中注册。
        结果
        true如果且仅当此字符集被其实施者知晓才能在IANA注册
      • displayName

        public String displayName​(Locale locale)
        返回给定语言环境的此charset的可读名称。

        此方法的默认实现只返回此charset的规范名称。 此类的具体子类可以重写此方法,以便提供本地化的显示名称。

        参数
        locale - 要为其检索显示名称的语言环境
        结果
        给定语言环境中此charset的显示名称
      • contains

        public abstract boolean contains​(Charset cs)
        判断此charset是否包含给定的charset。

        字符集C被据说含有如果一个字符集d,且仅当在d每一个字符表示的也是用C表示的。 如果这种关系成立,则保证可以在D中编码的每个字符串也可以在C中编码而不执行任何替换。

        C包含D并不意味着特定字节序列在C中表示的每个字符在D中由相同的字节序列表示,尽管有时也是如此。

        每个字符集都包含自己。

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

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

        public abstract CharsetDecoder newDecoder()
        为这个charset构造一个新的解码器。
        结果
        这个charset的新解码器
      • canEncode

        public boolean canEncode()
        判断此charset是否支持编码。

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

        结果
        true当且仅当此charset支持编码时
      • decode

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

        在charset cs调用此方法将返回与表达式相同的结果

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

        此方法始终使用此charset的缺省替换字节数组替换格式错误的输入和不可映射的字符序列。 要检测此类序列,请直接使用CharsetDecoder.decode(java.nio.ByteBuffer)方法。

        参数
        bb - 要解码的字节缓冲区
        结果
        包含已解码字符的char缓冲区
      • encode

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

        在charset cs调用此方法将返回与表达式相同的结果

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

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

        参数
        cb - 要编码的char缓冲区
        结果
        包含编码字符的字节缓冲区
      • encode

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

        在charset cs调用此方法将返回与表达式相同的结果

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

        public final int compareTo​(Charset that)
        比较这个charset到另一个。

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

        Specified by:
        compareTo在界面 Comparable<Charset>
        参数
        that - 要将此字符集与之比较的字符集
        结果
        一个负整数,零或正整数,因为此charset小于,等于或大于指定的charset
      • equals

        public final boolean equals​(Object ob)
        判断此对象是否与另一个对象相等。

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

        重写:
        equals在类 Object
        参数
        ob - 要与之比较的引用对象。
        结果
        true当且仅当此charset等于给定对象时
        另请参见:
        Object.hashCode()HashMap
      • toString

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