点评字符串编码认知

原创 2012年03月22日 23:45:43
字符串重编码
这个问题说来比较简单,转码就一行搞定,不信你看看,但究竟为什么要转码,是个很深奥的问题,看例子:
import java.io.UnsupportedEncodingException; 

/** 
* 字符串转码测试 

* @author leizhimin 2009-7-17 10:50:06 
*/
 
public class TestEncoding { 
        public static void main(String[] args) throws UnsupportedEncodingException { 
                System.out.println("转码前,输出Java系统属性如下:"); 
                System.out.println("user.country:" + System.getProperty("user.country")); 
                System.out.println("user.language:" + System.getProperty("user.language")); 
                System.out.println("sun.jnu.encoding:" + System.getProperty("sun.jnu.encoding")); 
                System.out.println("file.encoding:" + System.getProperty("file.encoding")); 

                System.out.println("---------------"); 
                String s = "熔岩博客"
                String s1 = new String(s.getBytes(), "UTF-8"); 
                String s2 = new String(s.getBytes("UTF-8"), "UTF-8"); 
                String s3 = new String(s.getBytes("UTF-8")); 
                String s4 = new String(s.getBytes("UTF-8"), "GBK"); 
                String s5 = new String(s.getBytes("GBK")); 
                String s6 = new String(s.getBytes("GBK"), "GBK"); 
                System.out.println(s1); 
                System.out.println(s2); 
                System.out.println(s3); 
                System.out.println(s4); 
                System.out.println(s5); 
                System.out.println(s6); 
        } 
}
 
输出结果:
转码前,输出Java系统属性如下: 
user.country:CN 
user.language:zh 
sun.jnu.encoding:GBK 
file.encoding:UTF-8 
--------------- 
熔岩博客 
熔岩博客 
熔岩博客 
鐔斿博鍗氬 
���Ҳ��� 
熔岩博客 

Process finished with exit code 0
 
以下是我对打印结果的理解:
大环境:JVM 的 file.encoding 属性的值为:UTF-8
表明代码文件中的中文是以 UTF-8 进行编码的

结论1:s1,s2,s3 都是差不多的:
依据1。getBytes() 等价于  getBytes(Charset.defaultCharset().toString());
则:getBytes() 等同于 getBytes("UTF-8")
依据2。String s = new String(byte[]) 等价于 String s = new String(byte[], defaultCharset);
则:new String(byte[]) 等同于 new String(byte[], "UTF-8");

关于s4,字符串编码已经由 UTF-8 转码为 GBK
如果这个被转换为 GBK 编码的字符串被放到  file.encoding=“GBK” 的代码编辑器里面,
我想 s4 应该是能够正常打印成中文的~
但是如前所述,本次案例的代码编辑器仅能正常显示UTF-8编码的汉字,
那么,尽管s4是那么的“表里如一”,也就只能受尽委屈了

关于s5,那句代码是等价于 String s5 = new String(s.getBytes("GBK"), "UTF-8"); 的
s 显然是 UTF-8 编码的汉字(汉字只是字节数据按编码表映射出来的显示在你面前的符号,计算机内部其实他是字节数据),
编码表就如同一个字典,由一个个的 “1或多个字节 <--> 符号(英文,汉字,韩文,日语等字符)” 键值对组成。
(1个字符可能不仅仅对应于1个byte字节。实际上,ASCII里面的每个符号都对应一个字节,汉字多是对应2到多个字节)。
很遗憾,因为全世界n多国家和种族部落,所以大家用的并非同一套编码表,不然就没有那么多编码的问题了~
我深深为这个问题折磨过很长一段时间,我也相信,还有不少人和我一样遭受着同样的烦恼~
先分析 s.getBytes("GBK") 这段代码,他做了这样一些事情:
把s分割成一个个的字符,形如:'熔','岩','博','客'。
然后,拿这些字符去查 GBK 这张字符编码表,
得到这些字符所对应的字节数据,这些字节数据加在一起便成了字节数组 byte[] 这种数据类型,第一小段分析完毕。
然后分析第二小段:new String(s.getBytes("GBK"), "UTF-8");
如上所述,s.getBytes("GBK") 得到了一个字节数组 byte[],
现在,又用这些字节去查 UTF-8 这张字符编码表,
和之前叙述过的情况比较相似,不过前面是用符号查字节,现在反过来了,使用字节去查所对应的符号,
而且,一个不容忽视的细节是:
现在用的这张表和前面所用的表已经不是同一张表了(前面是GBK表,后面是 UTF-8 表)~
下面已经不用我多赘述了,无疑解码出来的 java 字符串肯定是要乱套了。
(java中的编码和解码所指的是什么,我一直没得到过工整的答案。
我推测,字符串->字节=编码,反之为解码。依据:
我认为码应该是更为核心的东西——对于计算机而言,而字符作为映射出来的物件,显得没字节数据那么沉)。

关于s6,用上面的理论来加以推算,得到能够正常显示出来的中文是非常合理的!!

个人认知,如有不准确的论述,欢迎各位拍砖!!!
本文出自 “yang3wei” 博客,如需转载,请评论告知!
版权声明:本文为博主原创文章,未经博主允许不得转载。

美团点评2016研发题目-[编程题-美团] 字符编码

美团点评2016研发题目-[编程题-美团] 字符编码
  • mine_song
  • mine_song
  • 2017年07月24日 20:28
  • 216

脑科学对“天才”的科学分析——新书《无为》解读

《无为》的作者是加拿大不列颠哥伦比亚大学的教授Edward Slingerland(中文名森舸澜,下同),是一名汉学家,研究的是古代庄子的“无为”思想。该书出版于2015年,英文标题是《Trying ...
  • s1314_JHC
  • s1314_JHC
  • 2017年09月28日 23:02
  • 320

软件开发基本认知观

软件开发的工作就是在电脑前写写代码、敲敲键盘吗? 其实,软件开发是一个很大的领域。一个软件项目的完成,是有一个软件过程的。在这个过程中,写代码只是占用了很少的时间,在写代码前面,还有业务分析、需求分...
  • Enjolras_fuu
  • Enjolras_fuu
  • 2017年03月01日 10:27
  • 534

“认知反映测试”——衡量一个人是“在短暂的思考后迅速解决问题”还是“通过一段长反射弧深思熟虑后再做决定”

有三个问题:  1.一副球拍和球成本1.10美元。球拍比球成本高1.00美元。问球多少美元?  2.如果五台机器生产五个零件需要五分钟,那么100台机器生产100个零件需要多长时间?  3.一个湖中有...
  • xiao_lxl
  • xiao_lxl
  • 2015年08月07日 16:57
  • 1837

人的四种认知状态

我一直在思索,怎么才能让一家公司更快地成长?一个人怎么才能从一群人的竞争当中脱颖而出? 1、人的四种认知状态 最近我看了一幅图,我在其上加了一个数字注脚。 这是一个人...
  • THMAIL
  • THMAIL
  • 2017年05月15日 12:36
  • 1568

读书笔记--认知突围

首先应该明白的第一点就是,作者的背景。蔡垒磊----->大学经济学院 为什么?  因为了解作者的背景,会对了解作者的思路和想法有帮助。 因为每个人,都在历史的惯性下,都带着历史的印记。 ...
  • iamxxdd
  • iamxxdd
  • 2017年11月02日 13:05
  • 100

《面筋:拿到美团点评和去哪儿网的offer》

《面筋:拿到美团点评和去哪儿网的offer》前言从9月25号下午面完百度之后,就结束了自己的找工作旅程。就这样浪了20来天,想想还是写篇面筋吧,可能会对学弟学妹有一点点帮助。自我介绍在写面筋之前,先说...
  • u010412719
  • u010412719
  • 2016年10月15日 22:30
  • 2749

微软认知服务开发实践(2) - 计算机视觉

前言 计算机视觉所涉及的面很广泛,Computer Vision API中提供了几个常用的分析功能,可实现解读图片内容信息,对图片进行OCR识别,生成缩略图,未来也许会增加更多功能。本文将针对其分别...
  • GoodShot
  • GoodShot
  • 2017年03月29日 12:20
  • 440

JAVA如何判断字符串编码

public static String getEncoding(String str) {              String encode = "GB2312";             ...
  • alane1986
  • alane1986
  • 2015年06月18日 09:51
  • 6561

js为字符串编码

js 提供了两组函数来进行字符串的编码与解码:escape()与unescape(), decodeURI()与encodeURI(); JavaScript escape()...
  • u012763269
  • u012763269
  • 2015年08月17日 14:25
  • 774
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:点评字符串编码认知
举报原因:
原因补充:

(最多只允许输入30个字)