论编码与解码

本文详细解析了字符串的编码与解码过程,包括UTF-8、GBK、BIG5等常见编码格式的使用场景及注意事项。通过实例演示了编码、解码的过程,并解释了乱码产生的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、字符串的编码和解码

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

            //Convert from String to byte[]:

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

输出:

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

如何解码:(解码时首先要明白是采用什么方式编码的) 如上我们知道采用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进行解码,就会出现乱码:

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

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

涓浗

注意事项

1.控制台的输出也会有对应的编码格式,这个编码格式是支持输出的字符串的显示的编码。比如UTF-8代表中文的输出也可以打印,如果改为:ISO-8859-1,中文就无法显示了,因为,ISO-8859-1无法对中文进行编码。 2.所以控制台尽量采用UTF-8格式,这样几乎所有的输出都能够看到。


理论上通过通过编码格式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,
中国

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

两种编码格式都能够兼容的,采用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

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

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

引用文章:

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

转载于:https://my.oschina.net/u/2525142/blog/617762

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值