浏览 1535 次
锁定老帖子 主题:Java字符串的编码
精华帖 (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<String, Charset> map=Charset.availableCharsets(); System.out.println(map.size()); for(String s:map.keySet()){ System.out.println(s+"===> "+map.get(s)); } } } </pre> 输出的结果如下: <pre name="code" class="java">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 </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<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> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |