java 中编码字符 转载

/*在字节流与字符流之间起桥梁作用的InputStreamReader与 OutputStreamWriter类,
InputStreamReader使用指定的字符集(charSet)读取字节,解码为字符,OutPutStream使用指定的字符集将字符编码为字 节,
写入到输出流中
Charset类(java.nio.charset.Charset):要获取JVM当前可以使用的字符集,可以使用该类中的
static sortedMap availableCharset();下面利用该类中的availableCharsets()看一下在JVM中国有哪些字符集可以使用的

package IO;
import java.util.Map;
import java.nio.charset.*;
import java.util.Set;
import java.util.Map.Entry;
import java.util.Iterator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class CharsetTest{
public static void main(String[]args){
   Map map=Charset.availableCharsets();
   Set set=map.keySet();
   Iterator it=set.iterator();

   while(it.hasNext()){
    System.out.println(it.next());
   }
   }
}*/
/*返回值是
Big5
Big5-HKSCS
EUC-JP
EUC-KR
GB18030
GB2312
GBK
IBM-Thai
IBM00858
IBM01140
IBM01141
IBM01142
IBM01143
IBM01144
IBM01145
IBM01146
IBM01147
IBM01148
IBM01149
IBM037
IBM1026
IBM1047
IBM273
IBM277
IBM278
IBM280
IBM284
IBM285
IBM297
IBM420
IBM424
IBM437
IBM500
IBM775
IBM850
IBM852
IBM855
IBM857
IBM860
IBM861
IBM862
IBM863
IBM864
IBM865
IBM866
IBM868
IBM869
IBM870
IBM871
IBM918
ISO-2022-CN
ISO-2022-JP
ISO-2022-JP-2
ISO-2022-KR
ISO-8859-1
ISO-8859-13
ISO-8859-15
ISO-8859-2
ISO-8859-3
ISO-8859-4
ISO-8859-5
ISO-8859-6
ISO-8859-7
ISO-8859-8
ISO-8859-9
JIS_X0201
JIS_X0212-1990
KOI8-R
KOI8-U
Shift_JIS
TIS-620
US-ASCII
UTF-16
UTF-16BE
UTF-16LE
UTF-32
UTF-32BE
UTF-32LE
UTF-8
windows-1250
windows-1251
windows-1252
windows-1253
windows-1254
windows-1255
windows-1256
windows-1257
windows-1258
windows-31j
x-Big5-Solaris
x-euc-jp-linux
x-EUC-TW
x-eucJP-Open
x-IBM1006
x-IBM1025
x-IBM1046
x-IBM1097
x-IBM1098
x-IBM1112
x-IBM1122
x-IBM1123
x-IBM1124
x-IBM1381
x-IBM1383
x-IBM33722
x-IBM737
x-IBM834
x-IBM856
x-IBM874
x-IBM875
x-IBM921
x-IBM922
x-IBM930
x-IBM933
x-IBM935
x-IBM937
x-IBM939
x-IBM942
x-IBM942C
x-IBM943
x-IBM943C
x-IBM948
x-IBM949
x-IBM949C
x-IBM950
x-IBM964
x-IBM970
x-ISCII91
x-ISO-2022-CN-CNS
x-ISO-2022-CN-GB
x-iso-8859-11
x-JIS0208
x-JISAutoDetect
x-Johab
x-MacArabic
x-MacCentralEurope
x-MacCroatian
x-MacCyrillic
x-MacDingbat
x-MacGreek
x-MacHebrew
x-MacIceland
x-MacRoman
x-MacRomania
x-MacSymbol
x-MacThai
x-MacTurkish
x-MacUkraine
x-MS932_0213
x-MS950-HKSCS
x-mswin-936
x-PCK
x-SJIS_0213
x-UTF-16LE-BOM
X-UTF-32BE-BOM
X-UTF-32LE-BOM
x-windows-50220
x-windows-50221
x-windows-874
x-windows-949
x-windows-950
x-windows-iso2022jp
*/
/* 下面再看一下当前JVM使用的默认字符编码集
System类里面有一个static Properties getProperties()返回当前系统属性,Properties 里面有一个
void list(PrintStream out) 将属性列表输出到指定的输出流。
package IO;
public class CharsetTest{
public static void main(String[]args){
   System.getProperties().list(System.out);
   }
   }*/

/*在java中当我们把一个字节转换为一个字符的时候这个字符使用Unicode表示的这个过程叫做解码,
当我们把一个Uniocode码转换为本地字符集所表示的代码,这个过程叫编码(outputStreamReader),

Java中字节与字符都是使用Unicode来表示的 ,构造一个字符串就是解码过程,将字符或者字符串转换成字节
就是编码过程
   利用一个现成的函数从数据库中读取一条记录(汉字的),打印出来是乱码,有可能是这个函数再将字节解码
   成字符串的时候,采用的是其他字符集例如ISO-8859-1,而当我们利用System.out 对象打印字符串出来的时候
   System.out对像在中文系统平台上采用GBK字符集创建的,打印的时候会将字符串编码程字节数组的时候就会使乱码了
   碰到这种情况,可以讲得到的字符串在按照ISO-8859-1编码为字节数组 ,这样就可以得到了中文字符原先的GBK
   码 ,然后在用GBK字符集解码为字符串,再次打印就不会是乱码了*/
   package IO;
   import java.util.Properties;
   public class CharsetTest{
    public static void main(String[]args)throws Exception{
     Properties p=System.getProperties();
     p.put("file.encoding","ISO-8859-1");
     int data;
     byte[]b=new byte[1024];
      int i=0;
     while((data=System.in.read())!='q')
     {b[i]=(byte)data;
     i++;
     }//如果输入的是中文的话,由于在计算机中没有中文的都是它相对应的二进制数,在Windows中
     //所输入的中文读进去的是中文字符所对应的GBK码制,存储到字节数组中,一个中文站2个字节
         String s= new String(b,0,i);//因为已经将缺省的字符编码集改为ISo-8859—1,所以解码的时候
      //回用IOS-8859-1解码为unicode字符串,刚才读入的中文是系统平台下对应的字符集,中文的操作系统对应的字符集就是GBK码,
      //所以当读入的时候在字节数组中存储的是中文书组对应得GBK码,
          //当用new String去构造字符串的时候,使用JVM缺省的编码方式,现在已将JVM的默认编码方式改为ISO-8859-1,
     System.out.println(s);//于是解码用相对应的IOS-8859-1UNIcode码,然后去构造这个字符串
     //打印的时候会按照GBK码制去解码,所以打印的死乱码
     System.out.println(new String(s.getBytes("ISO-8859-1"),"GBK"));//利用s.getBytes("ISO-8859-1")去
     // 按照ISO-8859-1编码为"ISO-8859-1")字节数组,然后在按照“GBK”解码为String,
    
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值