Most visited

Recently visited

Added in API level 1

Charset

public abstract class Charset
extends Object implements Comparable<Charset>

java.lang.Object
   ↳ java.nio.charset.Charset


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

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

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

Charset names

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

  • The uppercase letters 'A' through 'Z' ('\u0041' through '\u005a'),
  • The lowercase letters 'a' through 'z' ('\u0061' through '\u007a'),
  • The digits '0' through '9' ('\u0030' through '\u0039'),
  • The dash character '-' ('\u002d'HYPHEN-MINUS),
  • The plus character '+' ('\u002b'PLUS SIGN),
  • The period character '.' ('\u002e'FULL STOP),
  • The colon character ':' ('\u003a'COLON), and
  • The underscore character '_' ('\u005f'LOW LINE).
A charset name must begin with either a letter or a digit. The empty string is not a legal charset name. Charset names are not case-sensitive; that is, case is always ignored when comparing charset names. Charset names generally follow the conventions documented in
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. A charset's historical name is either its canonical name or one of its aliases. The historical name is returned by the getEncoding() methods of the InputStreamReaderOutputStreamWriter类。

If a charset listed in the IANA Charset Registry由Java平台的实现支持,其规范名称必须是注册表中列出的名称。 许多字符集在注册表中都有多个名称,在这种情况下,注册表将其中一个名称标识为MIME首选 如果charset具有多个注册表名称,则其规范名称必须是MIME首选名称,并且注册表中的其他名称必须是有效的别名。 如果受支持的字符集未在IANA注册表中列出,则其规范名称必须以字符串"X-""x-"之一开头

IANA字符集注册表的确会随着时间而改变,所以规范的名称和特定字符集的别名也可能随着时间而改变。 为了确保兼容性,建议不要从charset中删除别名,并且如果charset的规范名称已更改,则将其以前的规范名称设置为别名。

Standard charsets

Java平台的每个实现都需要支持以下标准字符集。 请参阅您的实施的发行文档以查看是否支持其他任何字符集。 这些可选字符集的行为可能因实现而有所不同。

字符集

描述

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

The UTF-8 charset is specified by RFC 2279 ; 它所基于的转换格式在ISO 10646-1的修正2中进行了规定,并且也在Unicode Standard中进行了描述

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

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

In any case, byte order marks occuring after the first element of an input sequence are not omitted since the same code is used to represent ZERO-WIDTH NON-BREAKING SPACE.

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

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

Terminology

本课程的名称取自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是编码日语的JIS X 0201,JIS X 0208和JIS X 0212编码字符集的字符集的名称。

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

也可以看看:

Summary

Protected constructors

Charset(String canonicalName, String[] aliases)

使用给定的规范名称和别名集初始化新的字符集。

Public methods

final Set<String> aliases()

返回包含此字符集别名的集合。

static SortedMap<StringCharset> availableCharsets()

构造从规范字符集名称到字符集对象的有序映射。

boolean canEncode()

告诉这个字符集是否支持编码。

final int compareTo(Charset that)

将这个字符集与另一个字符比较。

abstract boolean contains(Charset cs)

告诉这个字符集是否包含给定的字符集。

final CharBuffer decode(ByteBuffer bb)

将此字符集中的字节解码为Unicode字符的便捷方法。

static Charset defaultCharset()

返回此Java虚拟机的默认字符集。

String displayName()

返回此字符集的默认语言环境的人类可读名称。

String displayName(Locale locale)

为给定语言环境返回此字符集的人类可读名称。

final ByteBuffer encode(String str)

在此字符集中将字符串编码为字节的便捷方法。

final ByteBuffer encode(CharBuffer cb)

在此字符集中将Unicode字符编码为字节的便捷方法。

final boolean equals(Object ob)

告诉这个对象是否与另一个对象相等。

static Charset forName(String charsetName)

返回指定字符集的字符集对象。

final int hashCode()

计算此字符集的哈希码。

final boolean isRegistered()

告诉这个字符集是否在 IANA Charset Registry中注册。

static boolean isSupported(String charsetName)

告诉是否支持指定的字符集。

final String name()

返回此字符集的规范名称。

abstract CharsetDecoder newDecoder()

为这个字符集构造一个新的解码器。

abstract CharsetEncoder newEncoder()

为这个字符集构造一个新的编码器。

final String toString()

返回描述此字符集的字符串。

Inherited methods

From class java.lang.Object
From interface java.lang.Comparable

Protected constructors

Charset

Added in API level 1
Charset (String canonicalName, 
                String[] aliases)

使用给定的规范名称和别名集初始化新的字符集。

Parameters
canonicalName String: The canonical name of this charset
aliases String: An array of this charset's aliases, or null if it has no aliases
Throws
IllegalCharsetNameException If the canonical name or any of the aliases are illegal

Public methods

aliases

Added in API level 1
Set<String> aliases ()

返回包含此字符集别名的集合。

Returns
Set<String> An immutable set of this charset's aliases

availableCharsets

Added in API level 1
SortedMap<StringCharset> availableCharsets ()

构造从规范字符集名称到字符集对象的有序映射。

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

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

如果将新的字符集提供程序动态提供给当前的Java虚拟机,则此方法可能会在不同的时间返回不同的结果。 在没有这种变化的情况下,这种方法返回的字符集正是那些可以通过forName方法检索的字符集。

Returns
SortedMap<StringCharset> An immutable, case-insensitive map from canonical charset names to charset objects

canEncode

Added in API level 1
boolean canEncode ()

告诉这个字符集是否支持编码。

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

Returns
boolean true if, and only if, this charset supports encoding

compareTo

Added in API level 1
int compareTo (Charset that)

将这个字符集与另一个字符比较。

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

Parameters
that Charset: The charset to which this charset is to be compared
Returns
int A negative integer, zero, or a positive integer as this charset is less than, equal to, or greater than the specified charset

contains

Added in API level 1
boolean contains (Charset cs)

告诉这个字符集是否包含给定的字符集。

如果并且只有在D中可表示的每个字符也可以用C表示,则字符集C被认为包含字符集D. 如果这种关系成立,则保证每个可以在D中编码的字符串也可以用C编码,而不用执行任何替换。

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

每个charset都包含它自己。

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

Parameters
cs Charset
Returns
boolean true if the given charset is contained in this charset

decode

Added in API level 1
CharBuffer decode (ByteBuffer bb)

将此字符集中的字节解码为Unicode字符的便捷方法。

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

     cs.newDecoder()
       .onMalformedInput(CodingErrorAction.REPLACE)
       .onUnmappableCharacter(CodingErrorAction.REPLACE)
       .decode(bb); 
except that it is potentially more efficient because it can cache decoders between successive invocations.

This method always replaces malformed-input and unmappable-character sequences with this charset's default replacement byte array. In order to detect such sequences, use the decode(java.nio.ByteBuffer) method directly.

Parameters
bb ByteBuffer: The byte buffer to be decoded
Returns
CharBuffer A char buffer containing the decoded characters

defaultCharset

Added in API level 1
Charset defaultCharset ()

返回此Java虚拟机的默认字符集。

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

Returns
Charset A charset object for the default charset

displayName

Added in API level 1
String displayName ()

返回此字符集的默认语言环境的人类可读名称。

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

Returns
String The display name of this charset in the default locale

displayName

Added in API level 1
String displayName (Locale locale)

为给定语言环境返回此字符集的人类可读名称。

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

Parameters
locale Locale: The locale for which the display name is to be retrieved
Returns
String The display name of this charset in the given locale

encode

Added in API level 1
ByteBuffer encode (String str)

在此字符集中将字符串编码为字节的便捷方法。

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

     cs.encode(CharBuffer.wrap(s)); 

Parameters
str String: The string to be encoded
Returns
ByteBuffer A byte buffer containing the encoded characters

encode

Added in API level 1
ByteBuffer encode (CharBuffer cb)

在此字符集中将Unicode字符编码为字节的便捷方法。

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

     cs.newEncoder()
       .onMalformedInput(CodingErrorAction.REPLACE)
       .onUnmappableCharacter(CodingErrorAction.REPLACE)
       .encode(bb); 
except that it is potentially more efficient because it can cache encoders between successive invocations.

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

Parameters
cb CharBuffer: The char buffer to be encoded
Returns
ByteBuffer A byte buffer containing the encoded characters

equals

Added in API level 1
boolean equals (Object ob)

告诉这个对象是否与另一个对象相等。

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

Parameters
ob Object: the reference object with which to compare.
Returns
boolean true if, and only if, this charset is equal to the given object

forName

Added in API level 1
Charset forName (String charsetName)

返回指定字符集的字符集对象。

Parameters
charsetName String: The name of the requested charset; may be either a canonical name or an alias
Returns
Charset A charset object for the named charset
Throws
IllegalCharsetNameException If the given charset name is illegal
IllegalArgumentException If the given charsetName is null
UnsupportedCharsetException If no support for the named charset is available in this instance of the Java virtual machine

hashCode

Added in API level 1
int hashCode ()

计算此字符集的哈希码。

Returns
int An integer hashcode

isRegistered

Added in API level 1
boolean isRegistered ()

告诉这个字符集是否在 IANA Charset Registry中注册。

Returns
boolean true if, and only if, this charset is known by its implementor to be registered with the IANA

isSupported

Added in API level 1
boolean isSupported (String charsetName)

告诉是否支持指定的字符集。

Parameters
charsetName String: The name of the requested charset; may be either a canonical name or an alias
Returns
boolean true if, and only if, support for the named charset is available in the current Java virtual machine
Throws
IllegalCharsetNameException If the given charset name is illegal
IllegalArgumentException If the given charsetName is null

name

Added in API level 1
String name ()

返回此字符集的规范名称。

Returns
String The canonical name of this charset

newDecoder

Added in API level 1
CharsetDecoder newDecoder ()

为这个字符集构造一个新的解码器。

Returns
CharsetDecoder A new decoder for this charset

newEncoder

Added in API level 1
CharsetEncoder newEncoder ()

为这个字符集构造一个新的编码器。

Returns
CharsetEncoder A new encoder for this charset
Throws
UnsupportedOperationException If this charset does not support encoding

toString

Added in API level 1
String toString ()

返回描述此字符集的字符串。

Returns
String A string describing this charset

Hooray!