計算機世界中是以2進制來運行的,無論是指令,數據都是以2進制的形式提交給硬件處理,字符也一樣,必須轉換成2進制才能被計算機識别。所以各種各樣的字符編碼産生,簡單來說,字符編碼就是用唯一的一個二進制串表示唯一的一個字符。其中最著名的字符編碼就是ascii碼,如下圖。
隻是部分表
ascii碼表中字符按可見分成兩大類,一類是不可見字符,共33個,它們的ascii碼值是0~31和127,屬于控制字符或通信專用字符。表中其餘的字符是可見字符,它們的ascii碼值是32~126,屬于數字、字母、各種符号。
對于計算機來說,任何字符都是用ascii表示,人要是與計算機交流,雖然可以直接輸入字符的ascii碼,但這太不人道了,計算機的發明是為了給人解決問題而并非制造問題。人習慣用所見即所得的方式使用字符,我要輸入字符a的時候,直接按下鍵盤上的a鍵就行了,不要讓我輸入其ascii碼0x61。這要求是合理的,我們在鍵盤上鍵入的每個按鍵,都會由輸入系統根據ascii碼表轉換成對應的二進制acsii碼形式。這是對普通用戶來說夠用了,他們很少寫程序,可是做為程序員,我們經常要輸出字符串,字符串中的可見字符直接從鍵盤敲入就行了,對于那些不可見字符,如回車換行符等,肯定不能用鍵盤在字符串中直接敲下一個回車鍵。
我們的問題是,不可見字符如何寫出來。也就是說我們在寫字符串時,如何在其中加入不可見的控制符,這就需要編譯器或解釋器的支持了。由于可見字符本身是看得見的,所見即所得,大家使用中并不會有陌生感。對于那些不可見的控制字符,如果想使用它們時,該怎樣表示它們呢?比如我就是要讓程序輸出一段話,在結束處換行。控制字符看不見摸不着,怎麼寫出來?所以在使用這些不可見字符時必須想辦法讓其可見,但又不能表示成其它可見字符,所以,隻能讓可見字符不表示自身了,哈哈,有點難是嗎?這麼艱巨的任務顯然隻用一個可見字符是不可能完成的,于是編譯器想出了一個辦法,它引用了另一個可見字符’\’來搭配其它可見字符:用這種可見字符組合的形式表達不可見字符。表面上看,字符’\’是讓其它可見字符的意義變了,所以稱’\’為轉義字符,但本質上,這兩個可見字符合起來才是完整的不可見字符,比如換行符’\n’,’\’和’n’放到一起才是換行符的意義,并不是因為’n’前面有個’\’,’n’就不再是’n’而是換行符,一定要清楚不是這樣的。
ascii碼表中任何字符都是1個字節大小,在字符串中不可見字符雖然是用“轉義字符 可見字符”兩個字符來表示,但這隻是編譯器為了讓人們能寫出不可見字符的方式,目的是讓不可見字符變得“可見”,針對的是人,這樣人們寫程序時就能在字符串中用到不可見字符。不可見字符本身在編譯後還是那1個字節的ascii碼。說白了,我們能夠将不可見字符顯示出來,原因就是編譯器在給我們做支持,它将“轉義字符 可見字符”這種形式的不可見字符轉換成了該不可見字符的ascii碼。
為了說清楚,咱們以編譯器為界限,在編譯器左邊的是人,這裡的字符串是供人使用的,轉義字符是存在于這一邊的。編譯器右邊的是機器,這裡的字符串使用的都是ascii碼。
編譯器的左邊和右邊是不一樣的,區别是對“\n”的處理。編譯器左邊把它當成了兩個字符,編譯器右邊把它當成了一個字符。想想也是,畢竟代碼隻是文本字符串,字符串”abc\n”中的’\’和’n’肯定是兩個字符,編譯器會把’\’和’n’組合到一起成為’\n’而解釋成回車換行。可能您還是覺得懷疑,那我說一下編譯器對字符串的解釋過程。
編譯器對字符串的處理一般是逐個字符處理的,這樣便于處理轉義字符。若發現字符為’\’,就意識到這是轉義字符,按常理說後面肯定要跟着另一可見字符,于是先不做任何處理,馬上把後面的字符讀進來,分析這兩個字符的組合是哪個控制字符後一并處理。
咱們這裡拿編譯器解釋字符串”abc\n”舉例。代碼中的‘\n’本身是兩個字符’\’和’n’組成,’\n’是給人看的,用于在字符串中使用,其ascii碼是0xa是給機器看的。在計算機中,所有的字符都已經成了ascii碼,字符串”abc\n”則變成了ascii碼:0x61 0x62 0x63 0x5c 0x6e。
編譯器要逐個對比字符串中每個字符,前幾個字符是’a’、’b’、’c’,這都是可見字符,沒有異議,直接處理。當發現字符是’\’,知道這是轉義字符,得知道’\’後面的字符是什麼才能确定是哪個不可見字符,于是暫停處理’\’,把後面的字符讀進來,發現是’n’,便知道這是’\n’,表示一個換行符,于是将’\’和’n’用換行符的ascii代替,原來字符串”abc\n”的ascii碼就變成了0x61 0x62 0x63 0xa
說得足夠多了,我也嫌自己啰嗦了,大家看以下的例子吧,就在這一張圖中全部解釋清楚了。
代碼ascii.c過于簡單,純粹是為演示。大家可能注意到了xxd.sh這個腳本,它就是xxd命令的封裝,xxd命令可以逐字節查看文件,xxd.sh腳本内容如下:
腳本1/2
腳本2/2
希望對大家理解轉義字符有幫助。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!