众所周知,Spring是最为最流行的框架,其源码写得非常棒!!!
Spring注入一个类的时候,BeanFactory 收到的一个类名, 类名都是首字母大写的,但是注入使用的确是首字母小写,这就引发了思考,spring是怎么把首字母大写转小写的呢?
办法有很多,比如截取字符串改了放回去之类的;这里介绍一个最高效的方法。 用的是字符编码相关的知识点。
先上代码:
package cn.com.ddh;
public class TestAscii {
public static void main(String[] args) {
String s = "Abc";
char[] c = s.toCharArray();
c[0] = (char) (c[0]+(32)); //ASCII
c.toString();
System.out.println(c);
}
}
输入结果:abc
首先我们把字符串"Abc" 转成字符数组,然后C[0] 肯定就是首字母了,C[0]是A,A在ASCII码中是第65位,而在ASCII码中 大写字母和小写字母差了32个位置;
所以为了得到小写字母a ,我们可以将A+32 ,32是int类型 需要将结果强转,就能得到想要的小写字母 a了;
顺便再介绍一下,为什么可以按ASCII码的规矩就能讲大写字母转小写了:
首先我们写的 .Java 文件会被JVM编译成 .class文件 .Java文件 被JVM 转为.class文件后, 代码里的字符和字符串都是按unicode格式存在的
而unicode码的的前128位和 ASCII码的128位是一样的;所以我们可以直接使用
c[0] = (char) (c[0]+(32)); //ASCII
这样的方式来处理!好的 简单的部分到这里就结束了,下面的啰嗦是普及一下编码知识:
nicode 和 ASCII 的故事就多了 这里就不做延伸了,稍微简单的说下:
美国人用的是英文,他们发明了ASCII码 只用128位(0是第一位)就足够表示字母了,就够他们使用了,当时的美帝可能都没有想到除了他们还有其他人能够使用计算机就压根没替我们中国人,亚洲人着想。 后来不同国家的人把128-255位用来处理自己国家的语言;
但是美帝没良心,但是美帝的程序员有良心啊,他们后来为全世界的人们发明了unicode码;
unicode码,无论是半角的英文字母,还是全角的汉字,它们都是统一的一个字符,同时,也都是统一的两个字节,请注意”字符”和”字节”两个术语的不同,字节是一个8位的物理存贮单元,而字符则是一个文化相关的符号。在unicode中,一个字符就是两个字节。那我有时候只是用个英文本来只要一个字节,结果现在用了unicode却要两个字节了,这unicode不是傻逼么? 所以unicode编码在很长的一段时间都无法得到推广,随着互联网时代的到来,网络传输可是个大问题啊!这时候为解决unicode如何在网络上传输的问题,美帝的那帮程序员又来了,他们推广了面向传输的众多UTF(UCS Transfer Format)标准出现了,顾名思义,UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。UTF-8就是在互联网上使用最广的一种unicode的实现方式,这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,注意的是unicode一个中文字符占2个字节,而UTF-8一个中文字符占3个字节)。从unicode到uft-8并不是直接的对应,而是要过一些算法和规则来转换。