眾所周知疙筹,Spring是最為最流行的框架,其源碼寫(xiě)得非常棒=础6亍!
Spring注入一個(gè)類(lèi)的時(shí)候幕袱,BeanFactory 收到的一個(gè)類(lèi)名暴备, 類(lèi)名都是首字母大寫(xiě)的,但是注入使用的確是首字母小寫(xiě)们豌,這就引發(fā)了思考涯捻,spring是怎么把首字母大寫(xiě)轉(zhuǎn)小寫(xiě)的呢?
辦法有很多望迎,比如截取字符串改了放回去之類(lèi)的障癌;這里介紹一個(gè)最高效的方法。 用的是字符編碼相關(guān)的知識(shí)點(diǎn)擂煞。
先上代碼:
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);
}
}
輸入結(jié)果:abc
首先我們把字符串"Abc" 轉(zhuǎn)成字符數(shù)組混弥,然后C[0] 肯定就是首字母了,C[0]是A对省,A在ASCII碼中是第65位蝗拿,而在ASCII碼中 大寫(xiě)字母和小寫(xiě)字母差了32個(gè)位置;
所以為了得到小寫(xiě)字母a 蒿涎,我們可以將A+32 哀托,32是int類(lèi)型 需要將結(jié)果強(qiáng)轉(zhuǎn),就能得到想要的小寫(xiě)字母 a了劳秋;
順便再介紹一下仓手,為什么可以按ASCII碼的規(guī)矩就能講大寫(xiě)字母轉(zhuǎn)小寫(xiě)了:
首先我們寫(xiě)的 .Java 文件會(huì)被JVM編譯成 .class文件 .Java文件 被JVM 轉(zhuǎn)為.class文件后胖齐, 代碼里的字符和字符串都是按unicode格式存在的
而unicode碼的的前128位和 ASCII碼的128位是一樣的;所以我們可以直接使用
c[0] = (char) (c[0]+(32)); //ASCII
這樣的方式來(lái)處理嗽冒!好的 簡(jiǎn)單的部分到這里就結(jié)束了呀伙,下面的啰嗦是普及一下編碼知識(shí):
nicode 和 ASCII 的故事就多了 這里就不做延伸了,稍微簡(jiǎn)單的說(shuō)下:
美國(guó)人用的是英文添坊,他們發(fā)明了ASCII碼 只用128位(0是第一位)就足夠表示字母了剿另,就夠他們使用了,當(dāng)時(shí)的美帝可能都沒(méi)有想到除了他們還有其他人能夠使用計(jì)算機(jī)就壓根沒(méi)替我們中國(guó)人贬蛙,亞洲人著想雨女。 后來(lái)不同國(guó)家的人把128-255位用來(lái)處理自己國(guó)家的語(yǔ)言;
但是美帝沒(méi)良心阳准,但是美帝的程序員有良心啊氛堕,他們后來(lái)為全世界的人們發(fā)明了unicode碼;
unicode碼,無(wú)論是半角的英文字母野蝇,還是全角的漢字讼稚,它們都是統(tǒng)一的一個(gè)字符,同時(shí)浪耘,也都是統(tǒng)一的兩個(gè)字節(jié)乱灵,請(qǐng)注意”字符”和”字節(jié)”兩個(gè)術(shù)語(yǔ)的不同,字節(jié)是一個(gè)8位的物理存貯單元七冲,而字符則是一個(gè)文化相關(guān)的符號(hào)痛倚。在unicode中,一個(gè)字符就是兩個(gè)字節(jié)澜躺。那我有時(shí)候只是用個(gè)英文本來(lái)只要一個(gè)字節(jié)蝉稳,結(jié)果現(xiàn)在用了unicode卻要兩個(gè)字節(jié)了,這unicode不是傻逼么掘鄙? 所以u(píng)nicode編碼在很長(zhǎng)的一段時(shí)間都無(wú)法得到推廣耘戚,隨著互聯(lián)網(wǎng)時(shí)代的到來(lái),網(wǎng)絡(luò)傳輸可是個(gè)大問(wèn)題安倌收津!這時(shí)候?yàn)榻鉀Qunicode如何在網(wǎng)絡(luò)上傳輸?shù)膯?wèn)題,美帝的那幫程序員又來(lái)了浊伙,他們推廣了面向傳輸?shù)谋姸郩TF(UCS Transfer Format)標(biāo)準(zhǔn)出現(xiàn)了撞秋,顧名思義,UTF-8就是每次8個(gè)位傳輸數(shù)據(jù)嚣鄙,而UTF-16就是每次16個(gè)位吻贿。UTF-8就是在互聯(lián)網(wǎng)上使用最廣的一種unicode的實(shí)現(xiàn)方式,這是為傳輸而設(shè)計(jì)的編碼哑子,并使編碼無(wú)國(guó)界舅列,這樣就可以顯示全世界上所有文化的字符了肌割。
UTF-8最大的一個(gè)特點(diǎn),就是它是一種變長(zhǎng)的編碼方式帐要。它可以使用1~4個(gè)字節(jié)表示一個(gè)符號(hào)把敞,根據(jù)不同的符號(hào)而變化字節(jié)長(zhǎng)度,當(dāng)字符在ASCII碼的范圍時(shí)宠叼,就用一個(gè)字節(jié)表示先巴,保留了ASCII字符一個(gè)字節(jié)的編碼做為它的一部分其爵,注意的是unicode一個(gè)中文字符占2個(gè)字節(jié)冒冬,而UTF-8一個(gè)中文字符占3個(gè)字節(jié))。從unicode到uft-8并不是直接的對(duì)應(yīng)摩渺,而是要過(guò)一些算法和規(guī)則來(lái)轉(zhuǎn)換。