出現場景:在迭代中有一個需求是將pdf文件名修改成全部班級的名稱集合,出現的班級過多致使的文件名過長在linux下沒法建立文件和文件夾的狀況解決方式:通過查證,linux中文件名最長爲255字符,文件路徑最大長度爲4096字符。因此須要對班級名稱進行截斷,而且不只僅是根據字符串長度截斷,而是根據每個字母或者漢字對應的字符來計算獲得最後的文件名小於255個字符。javascript
鑑於以上場景,因而進行稍微的深究,對字符編碼相關的知識進行了一個深一步的學習html
字符java
簡介:字符簡單的來講就是咱們平常生活中用到的一些字符,好比數字、漢字、標點符號等。專業的介紹能夠參考百度百科) linux
字節segmentfault
簡介:計算機中的一個計量存儲容量的單位,常見的計算機中一個字節表明八位的二進制數學習
編碼編碼
簡介:其實 編碼 就是將字符轉爲二進制的規則,由於咱們知道計算機是經過 高電平 和 低電平 來分別表明 1 和 0,想讓計算機讀懂咱們的字符,就須要將 二進制數 和咱們的字符創建一個映射關係,這個過程就叫編碼。其實每一個人均可以定義本身的編碼規則,可是這樣就亂套了。因此一些組織就制定了統一的編碼規則。也就出現了咱們常見的 ASCII 、unicode 等編碼規則code
字符集orm
ASCII(字符集):創建了128個字符對應的數字編號,僅支持英文字母、一些標點符號、以及一些不可顯示的字符。htm
unicode (萬國碼 字符集):Unicode只是一個用來映射字符和數字的標準。它對支持字符的數量沒有限制,也不要求字符必須佔兩個、三個或者其它任意數量的字節。Unicode並不涉及字符是怎麼在字節中表示的,它僅僅指定了字符對應的數字。歸根結底,unicode就是把世界上全部的字符都和一個數字作對應,可是具體到這個數字在計算機中如何表示,他是無論的。
關於Unicode的其它誤解包括:Unicode支持的字符上限是65536個,Unicode字符必須佔兩個字節,這些都不正確。Unicode字符是怎樣被編碼成內存中的字節這是另外的話題,它是被UTF(Unicode Transformation Formats)定義的。
unicode的問題:好比,漢字
嚴
的 Unicode 是十六進制數4E25
,轉換成二進制數足足有15位(100111000100101
),也就是說,這個符號的表示至少須要2個字節。表示其餘更大的符號,可能須要3個字節或者4個字節,甚至更多。這裏就有兩個嚴重的問題,第一個問題是,如何才能區別 Unicode 和 ASCII ?計算機怎麼知道三個字節表示一個符號,而不是分別表示三個符號呢?第二個問題是,咱們已經知道,英文字母只用一個字節表示就夠了,若是 Unicode 統一規定,每一個符號用三個或四個字節表示,那麼每一個英文字母前都必然有二到三個字節是
0
,這對於存儲來講是極大的浪費,文本文件的大小會所以大出二三倍,這是沒法接受的。因而出現了對unicode字符集的不一樣的編碼方式
常見的編碼規則
ASCII碼的編碼規則:每一個二進制位(bit)有 0 1 兩個狀態,所以八個二進制位就可以組成 256 種不一樣的狀態,也就是 00000000 - 11111111,因爲ASCII字符集定義了128個字符,八個二進制位可以表達 256 個狀態,因此確定是夠用了,因此在 ASCII 碼中一個字符只佔一個字節(一個字節 === 8 bit)
UTF-8:是一種unicode的編碼方案,在UTF-8中,0-127號的字符用1個字節來表示,使用和US-ASCII相同的編碼。這意味着1980年代寫的文檔用UTF-8打開一點問題都沒有。只有128號及以上的字符才用2個,3個或者4個字節來表示。所以,UTF-8被稱做可變長度編碼,它可使用1~4個字節表示一個符號,根據不一樣的符號而變化字節長度。
UTF-16:另外一個流行的可變長度編碼方案是UTF-16,它使用2個或者4個字節來存儲字符。
javascript中的字符編碼
js中用的編碼方式不是UTF-八、UTF-16。而是 UCS-2,具體緣由是由於javascript誕生的時候,尚未UTF-16,可是好在UCS的碼點和unicode一致,因此他們是互相兼容的。二者的關係簡單說,就是UTF-16取代了UCS-2,或者說UCS-2整合進了UTF-16。因此,如今只有UTF-16,沒有UCS-2。
總結:
參考資料: