天天看點

Golang中的空字元,似花不是花

  最近在Linux下開發Go程式,發現一個奇怪的問題,在讀取Linux系統資訊時讀到了空字元,導緻了程式異常。在ASSIC中十六進制0為字元NUT,表示為空字元NULL。但這個字元在不同的程式設計語言、不同的運作環境中卻有着不一樣的呈現,如果換一個角度看,空字元也就是無字元也就能解釋ASSIC空字元沒有顯示了。

  在ASSIC中雖然十進制0-31、127為控制字元但各自的表現形式不一樣,比較常用的字元:如換行\n、制表符\t等表現較為明顯,空字元算較為特殊的。

  似花不是花的隻是一種錯覺,似它不是它;

  6461746100為ASSIC碼的十六進制表示,字元為dataNUT,下面使用Go與Java分别在Windows與Ubnuntu環境下看其表示形式。

  在Golang中不同平台有着不一樣的呈現效果,windows環境下可看得見,NUT空字元但在Linux環境下卻是不可見的。

  代碼如下:

  Ubuntu環境下IDEA的debug模式,輸出為:data|長度:5

Golang中的空字元,似花不是花

Windows環境下輸出:

Golang中的空字元,似花不是花

  空字元不是空格,空字元的ASSIC十六進制為0,空格的十六進制為32,字元串中兩者的處理也不相同;空格與空字元串是比較容易混淆的兩個字元;

  在字元串的處理:查找、替換、移除等操作中也比較容易把這兩者混淆。

  如上代碼想要替換字元串中的空字元,必須使用字元或轉義符進行;轉義符有兩種形式,八進制轉義符與十六進制轉義符,八進制轉義符格式為:\DDD,十六進制轉義符格式為:\xDD,DD為具體代表的ASSIC碼數字,Unicode轉義符:\uDDDD。

  原以為在Java中并不存在這種問題,比較符合直覺,空字元就是空字元,但實際上與Go一樣在不同平台也有不一樣的顯示效果,好在Java在IDEA中還是能夠看得到其字元串内部的字元資訊,可以明顯的看得到空字元的存在。

如下代碼。

  Windows中現在還比較正常,符合人類認知,将byte數組轉為字元串是可明顯看到有一個空字元存在,在不管是在debug時還是程式列印輸出,都輸出了空字元串;

程式輸出為:data |,長度:5

Golang中的空字元,似花不是花

  在Linux環境下,此時n字元串已經看不到空字元了,雖然内部字元數組中依然看得到空字元的存在,但輸出已經看不到空字元的存在。

程式輸出:data|,長度:5

Golang中的空字元,似花不是花

文章首發位址:https://mp.weixin.qq.com/s/4H-yEBkhTe9KVChQaNiP5w