论编码与解码

一、字符串的编码和解码java

如下是对字符串进行编码:编码

//Convert from String to byte[]:

    		String s = "中国";
    		byte[] b = s.getBytes("UTF-8");
    		for(byte i:b){
    			System.out.print(i+",");	
    		}

输出:code

-28,-72,-83,-27,-101,-67,

如何解码:(解码时首先要明白是采用什么方式编码的) 如上咱们知道采用UTF-8格式进行编码的,那么就采用UTF-8格式进行解码:utf-8

//Convert from byte[] to String:
    		byte[]  t = {-28,-72,-83,-27,-101,-67};
    		String  tt = new String(t,"UTF-8");
    		System.out.println(tt);

输出:字符串

中国

假如咱们解码的时候采用GBK进行解码,就会出现乱码:get

//Convert from byte[] to String:
    		byte[]  t = {-28,-72,-83,-27,-101,-67};
    		String  tt = new String(t,"GBK");
    		System.out.println(tt);

以上采用GBK方式进行解码,出现乱码,输出为:string

涓浗

注意事项it

1.控制台的输出也会有对应的编码格式,这个编码格式是支持输出的字符串的显示的编码。好比UTF-8表明中文的输出也能够打印,若是改成:ISO-8859-1,中文就没法显示了,由于,ISO-8859-1没法对中文进行编码。 2.因此控制台尽可能采用UTF-8格式,这样几乎全部的输出都可以看到。io


理论上经过经过编码格式A编码,再经过编码格式A解码,就不会出现乱码。注意:前提是编码格式A必必须可以进行编码和解码。若是A不可以进行编码,即便经过A进行解码也会出现乱码。字符编码

举个例子: 你是一个厨师,只会对蔬菜、水果、肉类这三种物品进行作菜。

这时候给你:苹果、橘子、白菜、萝卜、猪肉、羊肉你均可以进行分类,再给你一个 屠龙刀,你傻了。这屠龙刀是哪个分类?如何作菜?

这时候你的分类为: 、

蔬菜:白菜、萝卜 肉类:猪肉、羊肉 水果类:橘子、苹果

??? :屠龙刀

屠龙刀你不知道怎么办,就打了三个大大的问号 ??? 因此就会出现乱码了:

下面我举个例子:灰常形象:

//Convert from String to byte[]:
    		String s = "中国";
    		byte[] b = s.getBytes("big5");
    		for(byte i:b){
    			System.out.print(i+",");	
    		}
    		System.out.println();
    		//Convert from byte[] to String:
    		String  tt = new String(b,"big5");
    		System.out.println(tt);

输出:

-92,-92,63,
中?

分析输出结果 用big5编码再用big5解码为何会输出 “中?”呢

就是由于 "国" 在big5编码格式中不能顺利编码,就是big5编码格式中不能对 “国” 字进行编码,因此乱码了。

若是改成GBK或者UTF-8就能够了,由于GBK或者UTF-8可以顺利对 “国” 字进行编码和解码 以下:

//Convert from String to byte[]:
    		String s = "中国";
    		byte[] b = s.getBytes("GBK");
    		for(byte i:b){
    			System.out.print(i+",");	
    		}
    		System.out.println();
    		//Convert from byte[] to String:
    		String  tt = new String(b,"GBK");
    		System.out.println(tt);

输出结果:

-42,-48,-71,-6,
中国

总结: 不出现乱码的几个条件 一、编码格式可以兼容对应的 被编码者 二、在第一条的基础上,用A编码格式编码就要用A编码格式进行解码。 三、输出的结果和对应的平台也要支持对应的编码格式

两种编码格式都可以兼容的,采用A编码格式编码,再用B编码格式解码也能够正常显示,由于A、B都兼容,若是常规的ASCII编码, LFFFFF1112中111111


这种方式严重不建议,没啥意义

//Convert from String to byte[]:
    		String s = "LFFFFF1112中111111";
    		byte[] b = s.getBytes("gb2312");
    		
    		for(byte i:b){
    			System.out.print(i+",");	
    		}
    		
    		System.out.println();
    		//Convert from byte[] to String:
    		String  tt = new String(b,"UTF-8");
    		System.out.println(tt);

输出:除了中文部分,都可以正常显示,由于中文部分gb2312和UTF-8不是采用同一种编码格式

76,70,70,70,70,70,49,49,49,50,-42,-48,49,49,49,49,49,49,
LFFFFF1112��111111

说明几点 一、工做空间的编码格式,只是表明你编写程序的时候能够输入的编码,好比UTF-8就表明 String a = "你好" 可以正常显示,若是你把工做空间编码格式修改成:ISO-8859-1,你们都知道ISO-8859-1不支持中文,这样就会显示乱码: String a = "你好" ;但最好设置为UTF-8由于可以输入任何形式的内容。

二、控制台输出的编码格式也能够调,但最好设置为UTF-8格式,由于你可以输出任何形式的内容

引用文章:

字符串编码 stackoverflow 如何从一种编码格式转换为另一种编码格式 字符编码之间的转换

相关文章
相关标签/搜索