getBytes

字符集与编码(六)——getBytes方法及乱码初步

99封情书 提交于 2019-12-03 09:45:46
在 前一篇 里我们谈了Unicode的代码单元及string.length,现在接着前面的讨论继续谈string.getBytes()方法并对乱码的产生作初步分析。 string.getBytes方法 首先声明一下,以下讨论如无特别说明,均是在Java语言环境下。如果你用的不是java,我只能说声抱歉。但另一方面,我相信无论是何种语言或平台,也必然有类似的方法及类似的处理,而其中的原理也必将是相通的,当然了,具体到细节上则可能会有些差异。 带参数的调用 首先,string.getBytes它可以带参数去调用,这是最简单的情形,如下 @Test public void testGetBytesGbk() throws UnsupportedEncodingException { String str = "hello你好"; assertThat(str.getBytes("GBK").length).isEqualTo(9); } 因为GBK是变长编码,对ASCII字符采用一字节,汉字则是两字节,所以总的长度是1×5+2×2=5+4=9,所以测试是通过的。 注:本文代码均已经上传到开源中国oschina的git.oschina.net上,具体代码见 http://git.oschina.net/goldenshaw/java_code_complete/blob/master

文本在内存中的编码(3)——乱码探源(6)

自闭症网瘾萝莉.ら 提交于 2019-11-28 14:39:47
先讲个小故事,虽然跟主题有点不太相关哈: 唐朝诗人李绅,身为官员,脾气暴躁,瞧不起信教的,尤其鄙视装逼之僧人,动不动就对他们拳脚相加。曾扬言:“我可以接见他们,要能答出来还好,要是答不出来,我弄死他!”有一回一个和尚来跟他宣传因果报应,李绅问:“阿师 从哪里来,到哪里去呢 ?”僧答:“贫僧 从来处来,到去处去 。”李绅当时就急了, 撸起袖子,亮出了手腕:“我去年买了个表!” 来自知乎问答“ 古人是如何「装逼」的? ”,略有改动。 String到哪里去? 有了前面僧人的教训,在这里就不故弄玄虚了,应该说String的去处还是蛮确定的,那就是到byte[]中去,方式就是通过getBytes这一方法。 new String与getBytes 如果说new String(byte[], encoding)是从byte[]到String的过程,那么getBytes(encoding)则正好与之相反:它是从String到byte[]的过程。 或许我们应该说,它从去处来,又到来处去。 编码的逆转 显然,我们一直在说,String也不过是一堆byte,getBytes的过程不过是UTF-16编码的byte[]再转回去其它编码的byte[]的过程。无论是new String还是getBytes,不过都是在玩编码的转换而已。 从上图中可以看出String作为桥梁