Java字符串的编码_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Java字符串的编码

Java字符串的编码

 2013/12/10 22:09:05  qindongliang1922  程序员俱乐部  我要评论(0)
  • 摘要:计算机的底层存储只能是二进制字节,而常常大部分时候,我们都喜欢看那么我们能看懂的字符,这也就是字符串,在这个过程中,涉及2个概念,编码(Encode)和解码(Decode),通常而言,把明文的字符序列,转换成计算机理解的二进制序列这个过程称为编码,而把二进制序列转换成普通人能看懂的明文字符串这个过程称为解码。java中,默认使用的是Unicode字符集,但很多操作系统并不使用Unicode字符集,那么当从系统中读取到Java程序时,就可能出现乱码问题。JDK1
  • 标签:Java 字符串 编码
计算机的底层存储只能是二进制字节,而常常大部分时候,我们都喜欢看那么我们能看懂的字符,这也就是字符串,在这个过程中,涉及2个概念,编码(Encode)和解码(Decode) ,通常而言,把明文的字符序列,转换成计算机理解的二进制序列这个过程称为编码,而把二进制序列转换成普通人能看懂的明文字符串这个过程称为解码。


java中,默认使用的是Unicode字符集,但很多操作系统并不使用Unicode字符集,那么当从系统中读取到Java程序时,就可能出现乱码问题

JDK1.4提供了Charset来处理字节序列和字符序列之间的转换关系,该类包含了编码和解码的的方法,还提供了获取所有当前JDK所支持的字符集的方法,代码演示如下:


class="java">package com.qin.sanxian.newio;

import java.nio.charset.Charset;
import java.util.SortedMap;

public class TestCharset {
	
	public static void main(String[] args)throws Exception {
		
		//获取当前JDK支持的所有字符集
		SortedMap<String, Charset> map=Charset.availableCharsets();
		System.out.println(map.size());
		for(String s:map.keySet()){
			System.out.println(s+"===> "+map.get(s));
		}
		
	}

}


输出的结果如下:
166
Big5===> Big5
Big5-HKSCS===> Big5-HKSCS
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
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-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-IBM1364===> x-IBM1364
x-IBM1381===> x-IBM1381
x-IBM1383===> x-IBM1383
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

当然,对于我们China的程序员来说,下面的几个字符串编码是我们经常用的:
编码名描述GBK简体中文的字符集BIG5繁体中文字符集ISO-8859-1ISO拉丁字母表No.1,也叫做ISO-LATIN-1UTF-88位的UCS转换格式UTF-1616位的UCS转换格式,字节顺序由可选的字节顺序标记来标识UTF-16BE16位的UCS转换格式,Big-endian(最低地址存放高位字节)字节顺序UTF-16LE16位的UCS转换格式,Little-endian(最高地址存放低位字节)字节顺序


我们可以利用Charset这个类,来进行获取编码或解码器,从而完成对应的从字节向字符的转换,或者从字符向字节的转换。
示例代码如下


package com.qin.sanxian.newio;

import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;

/**
 * @author 三劫散仙
 * 编码转换
 * 
 * **/
public class TestCharset2 {
	
	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception{
		
		/**
		 * 创建简体中文对应的编码
		 * **/
		Charset cn=Charset.forName("GBK");
		
		//获取cn对应的编码器和解码器
		CharsetDecoder decode=cn.newDecoder();
		CharsetEncoder encode=cn.newEncoder();
		//创建一个CharBuffer对象
		CharBuffer  buff=CharBuffer.allocate(8);//容量为8的空间
		buff.put('三');
		buff.put('劫');
		buff.put('散');
		buff.put('仙');
		buff.flip();//封印未写入空间
		//将CharBuffer中的字符串转换成字节序列
		ByteBuffer b=encode.encode(buff);
		//循环访问,并打印
		for(int i=0;i<b.limit();i++){
			
			System.out.println("你能看懂吗?  :"+b.get(i));
		}
		//将ByteBuffer数据解码成字符串序列,我们能看懂的^_^
		System.out.println("======================================");
		
		System.out.println("老子能看懂了:  "+decode.decode(b));
		
	}

}


输出结果如下:

你能看懂吗?  :-56
你能看懂吗?  :-3
你能看懂吗?  :-67
你能看懂吗?  :-39
你能看懂吗?  :-55
你能看懂吗?  :-94
你能看懂吗?  :-49
你能看懂吗?  :-55
======================================
老子能看懂了:  三劫散仙


发表评论
用户名: 匿名