public abstract class Charset extends Object implements Comparable<Charset>
此类还定义了用于测试是否支持特定字符集的静态方法,用于通过名称查找字符集实例,以及构造包含当前Java虚拟机中可用的每个字符集的映射。 可以通过CharsetProvider
类中定义的服务提供程序接口添加对新字符集的支持。
字符串由以下字符组成的字符串命名:
每个字符集都有一个规范名称 ,也可能有一个或多个别名 。 规范名称由本类的name
方法返回。 常规名称通常是大写的。 字符集的别名由aliases
方法返回。
Some charsets have an historical name that is defined for compatibility with previous versions of the Java platform.字符集的历史名称是其规范名称或其别名之一。 历史名称由InputStreamReader
和OutputStreamWriter
课程的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.请参阅实现的发行说明文件,查看是否支持其他字符集。 这种可选字符集的行为在实现之间可能不同。
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' 表示的初始字节顺序标记来指示 。 字节顺序标记处理如下:
当解码时, UTF-16BE和UTF-16LE字符集将初始字节顺序标记解释为ZERO-WIDTH NON-BREAKING SPACE ; 当编码时,它们不会写入字节顺序标记。
当解码时, UTF-16字符集解释输入流开始处的字节顺序标记,以指示流的字节顺序,但如果没有字节顺序标记则默认为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是编码日语的JIS X 0201,JIS X 0208和JIS X 0212编码字符集的字符集的名称。
Java编程语言的本机字符编码是UTF-16。 因此,Java平台中的字符集定义了十六位UTF-16代码单元(即字符序列)和字节序列的序列之间的映射。
CharsetDecoder
, CharsetEncoder
, CharsetProvider
, Character
Modifier | Constructor and Description |
---|---|
protected |
Charset(String canonicalName, String[] aliases)
使用给定的规范名称和别名集初始化新的字符集。
|
Modifier and Type | Method and Description |
---|---|
Set<String> |
aliases()
返回一个包含此字符集的别名的集合。
|
static SortedMap<String,Charset> |
availableCharsets()
构造从规范字符集名称到字符集对象的排序映射。
|
boolean |
canEncode()
告诉这个字符集是否支持编码。
|
int |
compareTo(Charset that)
将此字符串与另一个字符集进行比较。
|
abstract boolean |
contains(Charset cs)
告知这个字符集是否包含给定的字符集。
|
CharBuffer |
decode(ByteBuffer bb)
便利方法,将此字符集中的字节解码为Unicode字符。
|
static Charset |
defaultCharset()
返回此Java虚拟机的默认字符集。
|
String |
displayName()
返回此字符集的默认语言环境的可读名称。
|
String |
displayName(Locale locale)
返回此字符集的给定语言环境的人类可读名称。
|
ByteBuffer |
encode(CharBuffer cb)
在这个字符集中将Unicode字符编码为字节的便捷方法。
|
ByteBuffer |
encode(String str)
在此字符集中将字符串编码为字节的便捷方法。
|
boolean |
equals(Object ob)
告诉这个对象是否等于另一个。
|
static Charset |
forName(String charsetName)
返回名为charset的charset对象。
|
int |
hashCode()
计算此字符集的哈希码。
|
boolean |
isRegistered()
告诉这个字符集是否在IANA Charset Registry中
注册 。
|
static boolean |
isSupported(String charsetName)
告诉是否支持命名的字符集。
|
String |
name()
返回此字符集的规范名称。
|
abstract CharsetDecoder |
newDecoder()
为此字符集构造一个新的解码器。
|
abstract CharsetEncoder |
newEncoder()
为此字符集构造一个新的编码器。
|
String |
toString()
返回描述此字符集的字符串。
|
protected Charset(String canonicalName, String[] aliases)
canonicalName
- 此字符集的规范名称
aliases
- 这个字符集的别名的数组,如果没有别名,则为null
IllegalCharsetNameException
- 如果规范名称或任何别名是非法的
public static boolean isSupported(String charsetName)
charsetName
- 请求的字符集的名称;
可能是规范名称或别名
IllegalCharsetNameException
- 如果给定的字符集名称是非法的
IllegalArgumentException
- 如果给定的
charsetName为空
public static Charset forName(String charsetName)
charsetName
- 请求的字符集的名称;
可能是规范名称或别名
IllegalCharsetNameException
- 如果给定的字符集名称是非法的
IllegalArgumentException
- 如果给定的
charsetName为空
UnsupportedCharsetException
- 如果在Java虚拟机的此实例中不支持命名的字符集
public static SortedMap<String,Charset> availableCharsets()
此方法返回的映射将为当前Java虚拟机中可用的每个字符集都有一个条目。 如果两个或多个支持的字符集具有相同的规范名称,则生成的映射将仅包含其中的一个; 它将包含哪一个没有指定。
调用此方法以及后续使用生成的映射可能会导致耗时的磁盘或网络I / O操作发生。 为需要枚举所有可用字符集的应用程序提供此方法,例如允许用户选择字符集。 forName
方法不使用此方法,而是采用有效的增量查找算法。
如果新的字符集提供程序动态地可用于当前的Java虚拟机,则此方法可能会在不同时间返回不同的结果。 在没有这些更改的情况下,通过此方法返回的字符集恰好是可以通过forName
方法检索的字符集。
public static Charset defaultCharset()
默认字符集在虚拟机启动期间确定,通常取决于底层操作系统的区域设置和字符集。
public final String name()
public String displayName()
这个方法的默认实现只是返回这个charset的规范名称。 此类的具体子类可以覆盖此方法,以提供本地化显示名称。
public final boolean isRegistered()
public String displayName(Locale locale)
这个方法的默认实现只是返回这个charset的规范名称。 此类的具体子类可以覆盖此方法,以提供本地化显示名称。
locale
- 要检索显示名称的区域设置
public abstract boolean contains(Charset cs)
据说C字符集包含一个字符集D,如果只有在D中表示的每个字符也可以在C中表示 。 如果这种关系成立,那么可以保证在D中编码的每个字符串也可以在C中进行编码,而不进行任何替换。
该C包含D并不意味着通过特定字节序列在C中表示的每个字符在D中以相同的字节序列表示,尽管有时是这种情况。
每个字符集都包含自身。
该方法计算遏制关系的近似值:如果返回true,则该字符集将包含给定的字符集; 但是,如果它返回false ,则不一定是这个字符集中不包含给定的字符集。
cs
- 给定的字符集
public abstract CharsetDecoder newDecoder()
public abstract CharsetEncoder newEncoder()
UnsupportedOperationException
- 如果此字符集不支持编码
public boolean canEncode()
几乎所有的字符集都支持编码。 主要的例外是专用自动检测字符集,其解码器可以通过检查输入字节序列来确定几种可能的编码方案中的哪一种。 这样的字符集不支持编码,因为无法确定在输出中应使用哪个编码。 这种字符集的实现应该覆盖此方法以返回false 。
public final CharBuffer decode(ByteBuffer bb)
在字符集cs上调用此方法返回与表达式相同的结果
cs.newDecoder()
.onMalformedInput(CodingErrorAction.REPLACE)
.onUnmappableCharacter(CodingErrorAction.REPLACE)
.decode(bb);
除了它可能更有效率,因为它可以在连续调用之间缓存解码器。
此方法总是用此字符集的默认替换字节数组替换格式错误的输入和不可映射字符序列。 为了检测这些序列,请直接使用CharsetDecoder.decode(java.nio.ByteBuffer)
方法。
bb
- 要解码的字节缓冲区
public final ByteBuffer encode(CharBuffer cb)
在字符集cs上调用此方法返回与表达式相同的结果
cs.newEncoder()
.onMalformedInput(CodingErrorAction.REPLACE)
.onUnmappableCharacter(CodingErrorAction.REPLACE)
.encode(bb);
除了它可能更有效率,因为它可以在连续调用之间缓存编码器。
此方法总是用此字符集的默认替换字符串替换格式错误的输入和不可映射字符序列。 为了检测这些序列,请直接使用CharsetEncoder.encode(java.nio.CharBuffer)
方法。
cb
- 要编码的char缓冲区
public final ByteBuffer encode(String str)
在字符集cs上调用此方法返回与表达式相同的结果
cs.encode(CharBuffer.wrap(s));
str
- 要编码的字符串
public final int compareTo(Charset that)
字符串按其规范名称排序,不考虑案例。
compareTo
在界面
Comparable<Charset>
that
- 要比较此字符集的字符集
public final int hashCode()
hashCode
在类别
Object
Object.equals(java.lang.Object)
,
System.identityHashCode(java.lang.Object)
public final boolean equals(Object ob)
两个字符串是相等的,只有当他们有相同的规范名称。 字符集从不等于任何其他类型的对象。
equals
在类别
Object
ob
- 与之比较的参考对象。
Object.hashCode()
, HashMap