高效編程之首字符大小寫轉(zhuǎn)換!

眾所周知,Spring是最為最流行的框架,其源碼寫得非常棒?。。?br> Spring注入一個(gè)類的時(shí)候,BeanFactory 收到的一個(gè)類名, 類名都是首字母大寫的,但是注入使用的確是首字母小寫,這就引發(fā)了思考,spring是怎么把首字母大寫轉(zhuǎn)小寫的呢?
辦法有很多,比如截取字符串改了放回去之類的;這里介紹一個(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碼中 大寫字母和小寫字母差了32個(gè)位置;
所以為了得到小寫字母a ,我們可以將A+32 ,32是int類型 需要將結(jié)果強(qiáng)轉(zhuǎn),就能得到想要的小寫字母 a了;

順便再介紹一下,為什么可以按ASCII碼的規(guī)矩就能講大寫字母轉(zhuǎn)小寫了:
首先我們寫的 .Java 文件會(huì)被JVM編譯成 .class文件 .Java文件 被JVM 轉(zhuǎn)為.class文件后, 代碼里的字符和字符串都是按unicode格式存在的
而unicode碼的的前128位和 ASCII碼的128位是一樣的;所以我們可以直接使用

c[0] = (char) (c[0]+(32)); //ASCII 

這樣的方式來處理!好的 簡單的部分到這里就結(jié)束了,下面的啰嗦是普及一下編碼知識(shí):
nicode 和 ASCII 的故事就多了 這里就不做延伸了,稍微簡單的說下:
美國人用的是英文,他們發(fā)明了ASCII碼 只用128位(0是第一位)就足夠表示字母了,就夠他們使用了,當(dāng)時(shí)的美帝可能都沒有想到除了他們還有其他人能夠使用計(jì)算機(jī)就壓根沒替我們中國人,亞洲人著想。 后來不同國家的人把128-255位用來處理自己國家的語言;

但是美帝沒良心,但是美帝的程序員有良心啊,他們后來為全世界的人們發(fā)明了unicode碼;

unicode碼,無論是半角的英文字母,還是全角的漢字,它們都是統(tǒng)一的一個(gè)字符,同時(shí),也都是統(tǒng)一的兩個(gè)字節(jié),請(qǐng)注意”字符”和”字節(jié)”兩個(gè)術(shù)語的不同,字節(jié)是一個(gè)8位的物理存貯單元,而字符則是一個(gè)文化相關(guān)的符號(hào)。在unicode中,一個(gè)字符就是兩個(gè)字節(jié)。那我有時(shí)候只是用個(gè)英文本來只要一個(gè)字節(jié),結(jié)果現(xiàn)在用了unicode卻要兩個(gè)字節(jié)了,這unicode不是傻逼么? 所以u(píng)nicode編碼在很長的一段時(shí)間都無法得到推廣,隨著互聯(lián)網(wǎng)時(shí)代的到來,網(wǎng)絡(luò)傳輸可是個(gè)大問題?。∵@時(shí)候?yàn)榻鉀Qunicode如何在網(wǎng)絡(luò)上傳輸?shù)膯栴},美帝的那幫程序員又來了,他們推廣了面向傳輸?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ì)的編碼,并使編碼無國界,這樣就可以顯示全世界上所有文化的字符了。

UTF-8最大的一個(gè)特點(diǎn),就是它是一種變長的編碼方式。它可以使用1~4個(gè)字節(jié)表示一個(gè)符號(hào),根據(jù)不同的符號(hào)而變化字節(jié)長度,當(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ī)則來轉(zhuǎn)換。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容