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[],該方法也是使用指定的字符集將字符串轉換成字節序列
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章