记录并分享下自己学习时的小插曲。
事情起源:java基础太次了,就打算,重新学一遍,再做做题。于是乎就碰见了这么道题:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入"我ABC汉DEF",6,应该输出为"我ABC"而不是"我ABC+汉的半个"。我就写了如下所示:
于是乎,我慌了。不应该是我AB的嘛,B呢?!!。然后又挨个试了“我”和“A”
宝宝慌了,在我认知里,中文不是2个字节,数字和英文占1个字节的嘛。。这神马鬼!~
于是乎翻书+问度娘,结果就是:貌似是不同的编码造成的。
然后就转码测试了下,发现汉字对于gbk的话是2个,utf-8的话是3个,utf-16的话是4个。这个就不上图了,后续给个gitHub的地址,如果有小伙伴对测试过程有兴趣的话可以看看。
然后根据这个就想到了char。接着,做了下char的测试。因为一开始大一学C语言的时候,我记得char是1个字节。结果控制台输出的是:2个字节。后来翻看了java核心技术卷一这本书,说:在java中,char数据类型是一个采用UTF-16编码表示Unicode码点的代码单元。java为了在不同机器上运行,忽视机器自身处理器位数,内部做的统一处理。所以说对于java来说,char占2个字节。
原来这道编程题编写的的隐藏条件是得用GBK或者其他占2字节的编码表示才能出正确结果,这是真正考察的重点。还是太年轻了。
这个记录一下,努力打好基础,争取早日从小白变成菜鸟!!
测试的gitHub:https://github.com/900emperor/ByteInterception/tree/master