Java面向对象系列[v1.0.0][Charset的功能和用法]

Charset的功能和用法

计算机里的文件、数据、图片等等都只是表象,所有文件在底层都是二进制文件,都是字节码,就文本文件而言,看到的是一个个的字符,也是因为系统将底层的二进制序列转换成字符的缘故,在这个过程中涉及到了编码【Encode】和解码【Decode】的过程
在这里插入图片描述
JDK提供了Charset来处理字节序列和字符序列之间的转换关系,该类包含了用于创建解码器和编码器的方法,还提供了获取Charset所支持字符集的方法。
Charset类是不可变的,它还提供了一个availableCharsets()静态方法来获取当前JDK所支持的所有字符集

import java.nio.charset.*;
import java.util.*;

public class CharsetTest
{
	public static void main(String[] args)
	{
		// 获取Java支持的全部字符集
		SortedMap<String, Charset> map = Charset.availableCharsets();
		for (var alias : map.keySet())
		{
			// 输出字符集的别名和对应的Charset对象
			System.out.println(alias + "----->"
				+ map.get(alias));
		}
	}
}

执行结果如下:


D:\BaiduNetdiskDownload\CrazyJava\codes\15\15.9>java CharsetTest
Big5----->Big5
Big5-HKSCS----->Big5-HKSCS
CESU-8----->CESU-8
EUC-JP----->EUC-JP
EUC-KR----->EUC-KR
GB18030----->GB18030
GB2312----->GB2312
GBK----->GBK
IBM-Thai----->IBM-Thai
IBM00858----->IBM00858
IBM01140----->IBM01140
IBM01141----->IBM01141
IBM01142----->IBM01142
IBM01143----->IBM01143
IBM01144----->IBM01144
IBM01145----->IBM01145
IBM01146----->IBM01146
IBM01147----->IBM01147
IBM01148----->IBM01148
IBM01149----->IBM01149
IBM037----->IBM037
IBM1026----->IBM1026
IBM1047----->IBM1047
IBM273----->IBM273
IBM277----->IBM277
IBM278----->IBM278
IBM280----->IBM280
IBM284----->IBM284
IBM285----->IBM285
IBM290----->IBM290
IBM297----->IBM297
IBM420----->IBM420
IBM424----->IBM424
IBM437----->IBM437
IBM500----->IBM500
IBM775----->IBM775
IBM850----->IBM850
IBM852----->IBM852
IBM855----->IBM855
IBM857----->IBM857
IBM860----->IBM860
IBM861----->IBM861
IBM862----->IBM862
IBM863----->IBM863
IBM864----->IBM864
IBM865----->IBM865
IBM866----->IBM866
IBM868----->IBM868
IBM869----->IBM869
IBM870----->IBM870
IBM871----->IBM871
IBM918----->IBM918
ISO-2022-CN----->ISO-2022-CN
ISO-2022-JP----->ISO-2022-JP
ISO-2022-JP-2----->ISO-2022-JP-2
ISO-2022-KR----->ISO-2022-KR
ISO-8859-1----->ISO-8859-1
ISO-8859-13----->ISO-8859-13
ISO-8859-15----->ISO-8859-15
ISO-8859-16----->ISO-8859-16
ISO-8859-2----->ISO-8859-2
ISO-8859-3----->ISO-8859-3
ISO-8859-4----->ISO-8859-4
ISO-8859-5----->ISO-8859-5
ISO-8859-6----->ISO-8859-6
ISO-8859-7----->ISO-8859-7
ISO-8859-8----->ISO-8859-8
ISO-8859-9----->ISO-8859-9
JIS_X0201----->JIS_X0201
JIS_X0212-1990----->JIS_X0212-1990
KOI8-R----->KOI8-R
KOI8-U----->KOI8-U
Shift_JIS----->Shift_JIS
TIS-620----->TIS-620
US-ASCII----->US-ASCII
UTF-16----->UTF-16
UTF-16BE----->UTF-16BE
UTF-16LE----->UTF-16LE
UTF-32----->UTF-32
UTF-32BE----->UTF-32BE
UTF-32LE----->UTF-32LE
UTF-8----->UTF-8
windows-1250----->windows-1250
windows-1251----->windows-1251
windows-1252----->windows-1252
windows-1253----->windows-1253
windows-1254----->windows-1254
windows-1255----->windows-1255
windows-1256----->windows-1256
windows-1257----->windows-1257
windows-1258----->windows-1258
windows-31j----->windows-31j
x-Big5-HKSCS-2001----->x-Big5-HKSCS-2001
x-Big5-Solaris----->x-Big5-Solaris
x-euc-jp-linux----->x-euc-jp-linux
x-EUC-TW----->x-EUC-TW
x-eucJP-Open----->x-eucJP-Open
x-IBM1006----->x-IBM1006
x-IBM1025----->x-IBM1025
x-IBM1046----->x-IBM1046
x-IBM1097----->x-IBM1097
x-IBM1098----->x-IBM1098
x-IBM1112----->x-IBM1112
x-IBM1122----->x-IBM1122
x-IBM1123----->x-IBM1123
x-IBM1124----->x-IBM1124
x-IBM1166----->x-IBM1166
x-IBM1364----->x-IBM1364
x-IBM1381----->x-IBM1381
x-IBM1383----->x-IBM1383
x-IBM300----->x-IBM300
x-IBM33722----->x-IBM33722
x-IBM737----->x-IBM737
x-IBM833----->x-IBM833
x-IBM834----->x-IBM834
x-IBM856----->x-IBM856
x-IBM874----->x-IBM874
x-IBM875----->x-IBM875
x-IBM921----->x-IBM921
x-IBM922----->x-IBM922
x-IBM930----->x-IBM930
x-IBM933----->x-IBM933
x-IBM935----->x-IBM935
x-IBM937----->x-IBM937
x-IBM939----->x-IBM939
x-IBM942----->x-IBM942
x-IBM942C----->x-IBM942C
x-IBM943----->x-IBM943
x-IBM943C----->x-IBM943C
x-IBM948----->x-IBM948
x-IBM949----->x-IBM949
x-IBM949C----->x-IBM949C
x-IBM950----->x-IBM950
x-IBM964----->x-IBM964
x-IBM970----->x-IBM970
x-ISCII91----->x-ISCII91
x-ISO-2022-CN-CNS----->x-ISO-2022-CN-CNS
x-ISO-2022-CN-GB----->x-ISO-2022-CN-GB
x-iso-8859-11----->x-iso-8859-11
x-JIS0208----->x-JIS0208
x-JISAutoDetect----->x-JISAutoDetect
x-Johab----->x-Johab
x-MacArabic----->x-MacArabic
x-MacCentralEurope----->x-MacCentralEurope
x-MacCroatian----->x-MacCroatian
x-MacCyrillic----->x-MacCyrillic
x-MacDingbat----->x-MacDingbat
x-MacGreek----->x-MacGreek
x-MacHebrew----->x-MacHebrew
x-MacIceland----->x-MacIceland
x-MacRoman----->x-MacRoman
x-MacRomania----->x-MacRomania
x-MacSymbol----->x-MacSymbol
x-MacThai----->x-MacThai
x-MacTurkish----->x-MacTurkish
x-MacUkraine----->x-MacUkraine
x-MS932_0213----->x-MS932_0213
x-MS950-HKSCS----->x-MS950-HKSCS
x-MS950-HKSCS-XP----->x-MS950-HKSCS-XP
x-mswin-936----->x-mswin-936
x-PCK----->x-PCK
x-SJIS_0213----->x-SJIS_0213
x-UTF-16LE-BOM----->x-UTF-16LE-BOM
X-UTF-32BE-BOM----->X-UTF-32BE-BOM
X-UTF-32LE-BOM----->X-UTF-32LE-BOM
x-windows-50220----->x-windows-50220
x-windows-50221----->x-windows-50221
x-windows-874----->x-windows-874
x-windows-949----->x-windows-949
x-windows-950----->x-windows-950
x-windows-iso2022jp----->x-windows-iso2022jp

可以使用System类的getProperties()方法来访问本地系统的文件编码格式,文件编码格式的属性名为file.encoding

一旦知道了字符集的别名之后,程序就可以调用Charset的forName()方法来创建对应的Charset对象,forName()方法的参数就是相应字符集的别名

Charset cs = Charset.forName("ISO-9001-1");
Charset csCn = Charset.forName("GBK");

获得了Charset对象后,就可以通过该对象的newDecoder()、newEncoder()这两个方法分别返回CharsetDecoder和CharsetEncoder对象,代表该Charset的解码器和编码器

调用CharsetDecoder的decode()方法就可以将ByteBuffer(字节序列)转换成CharBuffer(字符序列)
调用CharsetEncoder的encode()方法就可以将CharBuffer或String(字节序列)转换成ByteBuffer(字节序列)

Java7新增了一个StandardCharsets类,该类包含了ISO_8859_1、UTF_8、UTF_16等类变量,这些类变量代表了最常用的字符集对应的Charset对象

import java.nio.*;
import java.nio.charset.*;

public class CharsetTransform
{
	public static void main(String[] args)
		throws Exception
	{
		// 创建简体中文对应的Charset
		Charset cn = Charset.forName("GBK");
		// 获取cn对象对应的编码器和解码器
		CharsetEncoder cnEncoder = cn.newEncoder();
		CharsetDecoder cnDecoder = cn.newDecoder();
		// 创建一个CharBuffer对象
		CharBuffer cbuff = CharBuffer.allocate(8);
		cbuff.put('孙');
		cbuff.put('悟');
		cbuff.put('空');
		cbuff.flip();
		// 将CharBuffer中的字符序列转换成字节序列
		ByteBuffer bbuff = cnEncoder.encode(cbuff);
		// 循环访问ByteBuffer中的每个字节
		for (var i = 0; i < bbuff.capacity(); i++)
		{
			System.out.print(bbuff.get(i) + " ");
		}
		// 将ByteBuffer的数据解码成字符序列
		System.out.println("\n" + cnDecoder.decode(bbuff));
	}
}

Charset类提供了如下3个方法:

  • CharBuffer decode(ByteBuffer bb):将ByteBuffer中的字节序列转换成字符序列
  • ByteBuffer encode(CharBuffer cb):将CharBuffer中的字符序列转换成字节序列
  • ByteBuffer encode(String str):将String中的字符序列转换成字节序列
  • string类里也提供了一个getBytes(String charset)方法,该方法返回byte[],该方法也是使用指定的字符集将字符串转换成字节序列
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章