论坛首页 编程语言技术论坛

Java字符串的编码

浏览 1535 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-12-10  
计算机的底层存储只能是二进制字节,而常常大部分时候,我们都喜欢看那么我们能看懂的字符,这也就是字符串,在这个过程中,涉及2个概念,编码(Encode)和解码(Decode) ,通常而言,把明文的字符序列,转换成计算机理解的二进制序列这个过程称为编码,而把二进制序列转换成普通人能看懂的明文字符串这个过程称为解码。


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

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


<pre name="code" 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&lt;String, Charset&gt; map=Charset.availableCharsets();
System.out.println(map.size());
for(String s:map.keySet()){
System.out.println(s+"===&gt; "+map.get(s));
}

}

}
</pre>

输出的结果如下:
<pre name="code" class="java">166
Big5===&gt; Big5
Big5-HKSCS===&gt; Big5-HKSCS
EUC-JP===&gt; EUC-JP
EUC-KR===&gt; EUC-KR
GB18030===&gt; GB18030
GB2312===&gt; GB2312
GBK===&gt; GBK
IBM-Thai===&gt; IBM-Thai
IBM00858===&gt; IBM00858
IBM01140===&gt; IBM01140
IBM01141===&gt; IBM01141
IBM01142===&gt; IBM01142
IBM01143===&gt; IBM01143
IBM01144===&gt; IBM01144
IBM01145===&gt; IBM01145
IBM01146===&gt; IBM01146
IBM01147===&gt; IBM01147
IBM01148===&gt; IBM01148
IBM01149===&gt; IBM01149
IBM037===&gt; IBM037
IBM1026===&gt; IBM1026
IBM1047===&gt; IBM1047
IBM273===&gt; IBM273
IBM277===&gt; IBM277
IBM278===&gt; IBM278
IBM280===&gt; IBM280
IBM284===&gt; IBM284
IBM285===&gt; IBM285
IBM297===&gt; IBM297
IBM420===&gt; IBM420
IBM424===&gt; IBM424
IBM437===&gt; IBM437
IBM500===&gt; IBM500
IBM775===&gt; IBM775
IBM850===&gt; IBM850
IBM852===&gt; IBM852
IBM855===&gt; IBM855
IBM857===&gt; IBM857
IBM860===&gt; IBM860
IBM861===&gt; IBM861
IBM862===&gt; IBM862
IBM863===&gt; IBM863
IBM864===&gt; IBM864
IBM865===&gt; IBM865
IBM866===&gt; IBM866
IBM868===&gt; IBM868
IBM869===&gt; IBM869
IBM870===&gt; IBM870
IBM871===&gt; IBM871
IBM918===&gt; IBM918
ISO-2022-CN===&gt; ISO-2022-CN
ISO-2022-JP===&gt; ISO-2022-JP
ISO-2022-JP-2===&gt; ISO-2022-JP-2
ISO-2022-KR===&gt; ISO-2022-KR
ISO-8859-1===&gt; ISO-8859-1
ISO-8859-13===&gt; ISO-8859-13
ISO-8859-15===&gt; ISO-8859-15
ISO-8859-2===&gt; ISO-8859-2
ISO-8859-3===&gt; ISO-8859-3
ISO-8859-4===&gt; ISO-8859-4
ISO-8859-5===&gt; ISO-8859-5
ISO-8859-6===&gt; ISO-8859-6
ISO-8859-7===&gt; ISO-8859-7
ISO-8859-8===&gt; ISO-8859-8
ISO-8859-9===&gt; ISO-8859-9
JIS_X0201===&gt; JIS_X0201
JIS_X0212-1990===&gt; JIS_X0212-1990
KOI8-R===&gt; KOI8-R
KOI8-U===&gt; KOI8-U
Shift_JIS===&gt; Shift_JIS
TIS-620===&gt; TIS-620
US-ASCII===&gt; US-ASCII
UTF-16===&gt; UTF-16
UTF-16BE===&gt; UTF-16BE
UTF-16LE===&gt; UTF-16LE
UTF-32===&gt; UTF-32
UTF-32BE===&gt; UTF-32BE
UTF-32LE===&gt; UTF-32LE
UTF-8===&gt; UTF-8
windows-1250===&gt; windows-1250
windows-1251===&gt; windows-1251
windows-1252===&gt; windows-1252
windows-1253===&gt; windows-1253
windows-1254===&gt; windows-1254
windows-1255===&gt; windows-1255
windows-1256===&gt; windows-1256
windows-1257===&gt; windows-1257
windows-1258===&gt; windows-1258
windows-31j===&gt; windows-31j
x-Big5-HKSCS-2001===&gt; x-Big5-HKSCS-2001
x-Big5-Solaris===&gt; x-Big5-Solaris
x-euc-jp-linux===&gt; x-euc-jp-linux
x-EUC-TW===&gt; x-EUC-TW
x-eucJP-Open===&gt; x-eucJP-Open
x-IBM1006===&gt; x-IBM1006
x-IBM1025===&gt; x-IBM1025
x-IBM1046===&gt; x-IBM1046
x-IBM1097===&gt; x-IBM1097
x-IBM1098===&gt; x-IBM1098
x-IBM1112===&gt; x-IBM1112
x-IBM1122===&gt; x-IBM1122
x-IBM1123===&gt; x-IBM1123
x-IBM1124===&gt; x-IBM1124
x-IBM1364===&gt; x-IBM1364
x-IBM1381===&gt; x-IBM1381
x-IBM1383===&gt; x-IBM1383
x-IBM33722===&gt; x-IBM33722
x-IBM737===&gt; x-IBM737
x-IBM833===&gt; x-IBM833
x-IBM834===&gt; x-IBM834
x-IBM856===&gt; x-IBM856
x-IBM874===&gt; x-IBM874
x-IBM875===&gt; x-IBM875
x-IBM921===&gt; x-IBM921
x-IBM922===&gt; x-IBM922
x-IBM930===&gt; x-IBM930
x-IBM933===&gt; x-IBM933
x-IBM935===&gt; x-IBM935
x-IBM937===&gt; x-IBM937
x-IBM939===&gt; x-IBM939
x-IBM942===&gt; x-IBM942
x-IBM942C===&gt; x-IBM942C
x-IBM943===&gt; x-IBM943
x-IBM943C===&gt; x-IBM943C
x-IBM948===&gt; x-IBM948
x-IBM949===&gt; x-IBM949
x-IBM949C===&gt; x-IBM949C
x-IBM950===&gt; x-IBM950
x-IBM964===&gt; x-IBM964
x-IBM970===&gt; x-IBM970
x-ISCII91===&gt; x-ISCII91
x-ISO-2022-CN-CNS===&gt; x-ISO-2022-CN-CNS
x-ISO-2022-CN-GB===&gt; x-ISO-2022-CN-GB
x-iso-8859-11===&gt; x-iso-8859-11
x-JIS0208===&gt; x-JIS0208
x-JISAutoDetect===&gt; x-JISAutoDetect
x-Johab===&gt; x-Johab
x-MacArabic===&gt; x-MacArabic
x-MacCentralEurope===&gt; x-MacCentralEurope
x-MacCroatian===&gt; x-MacCroatian
x-MacCyrillic===&gt; x-MacCyrillic
x-MacDingbat===&gt; x-MacDingbat
x-MacGreek===&gt; x-MacGreek
x-MacHebrew===&gt; x-MacHebrew
x-MacIceland===&gt; x-MacIceland
x-MacRoman===&gt; x-MacRoman
x-MacRomania===&gt; x-MacRomania
x-MacSymbol===&gt; x-MacSymbol
x-MacThai===&gt; x-MacThai
x-MacTurkish===&gt; x-MacTurkish
x-MacUkraine===&gt; x-MacUkraine
x-MS932_0213===&gt; x-MS932_0213
x-MS950-HKSCS===&gt; x-MS950-HKSCS
x-MS950-HKSCS-XP===&gt; x-MS950-HKSCS-XP
x-mswin-936===&gt; x-mswin-936
x-PCK===&gt; x-PCK
x-SJIS_0213===&gt; x-SJIS_0213
x-UTF-16LE-BOM===&gt; x-UTF-16LE-BOM
X-UTF-32BE-BOM===&gt; X-UTF-32BE-BOM
X-UTF-32LE-BOM===&gt; X-UTF-32LE-BOM
x-windows-50220===&gt; x-windows-50220
x-windows-50221===&gt; x-windows-50221
x-windows-874===&gt; x-windows-874
x-windows-949===&gt; x-windows-949
x-windows-950===&gt; x-windows-950
x-windows-iso2022jp===&gt; x-windows-iso2022jp
</pre>
当然,对于我们China的程序员来说,下面的几个字符串编码是我们经常用的:
<table class="bbcode"><tr><td>编码名</td><td>描述<tr><td>GBK</td><td>简体中文的字符集<tr><td>BIG5</td><td>繁体中文字符集<tr><td>ISO-8859-1</td><td>ISO拉丁字母表No.1,也叫做ISO-LATIN-1<tr><td>UTF-8</td><td>8位的UCS转换格式<tr><td>UTF-16</td><td>16位的UCS转换格式,字节顺序由可选的字节顺序标记来标识<tr><td>UTF-16BE</td><td>16位的UCS转换格式,Big-endian(最低地址存放高位字节)字节顺序<tr><td>UTF-16LE</td><td>16位的UCS转换格式,Little-endian(最高地址存放低位字节)字节顺序</table>


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


<pre name="code" class="java">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&lt;b.limit();i++){

System.out.println("你能看懂吗?  :"+b.get(i));
}
//将ByteBuffer数据解码成字符串序列,我们能看懂的^_^
System.out.println("======================================");

System.out.println("老子能看懂了:  "+decode.decode(b));

}

}
</pre>

输出结果如下:

<pre name="code" class="java">你能看懂吗?  :-56
你能看懂吗?  :-3
你能看懂吗?  :-67
你能看懂吗?  :-39
你能看懂吗?  :-55
你能看懂吗?  :-94
你能看懂吗?  :-49
你能看懂吗?  :-55
======================================
老子能看懂了:  三劫散仙
</pre>

论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics