Linux下文件名長度限制

Linux下文件名長度限制

出現場景:在迭代中有一個需求是將pdf文件名修改爲所有班級的名稱集合,出現的班級過多導致的文件名過長在linux下無法創建文件和文件夾的情況

解決方式:經過查證,linux中文件名最長爲255字符,文件路徑最大長度爲4096字符。所以需要對班級名稱進行截斷,並且不僅僅是根據字符串長度截斷,而是根據每一個字母或者漢字對應的字符來計算得到最後的文件名小於255個字符。

鑑於以上場景,於是進行稍微的深究,對字符編碼相關的知識進行了一個深一步的學習

字符

簡介:字符簡單的來說就是我們日常生活中用到的一些字符,比如數字、漢字、標點符號等。專業的介紹可以參考百度百科)

字節

簡介:計算機中的一個計量存儲容量的單位,常見的計算機中一個字節代表八位的二進制數

編碼

簡介:其實 編碼 就是將字符轉爲二進制的規則,因爲我們知道計算機是通過 高電平 和 低電平 來分別代表 1 和 0,想讓計算機讀懂我們的字符,就需要將 二進制數 和我們的字符建立一個映射關係,這個過程就叫編碼。其實每個人都可以定義自己的編碼規則,但是這樣就亂套了。所以一些組織就制定了統一的編碼規則。也就出現了我們常見的 ASCII 、unicode 等編碼規則

字符集

ASCII(字符集):建立了128個字符對應的數字編號,僅支持英文字母、一些標點符號、以及一些不可顯示的字符。

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-8、UTF-16。而是 UCS-2,具體原因是因爲javascript誕生的時候,還沒有UTF-16,但是好在UCS的碼點和unicode一致,所以他們是互相兼容的。兩者的關係簡單說,就是UTF-16取代了UCS-2,或者說UCS-2整合進了UTF-16。所以,現在只有UTF-16,沒有UCS-2。

總結:

  1. Unicode是一個簡單的標準,用來把字符映射到數字上。Unicode協會的人會幫你處理所有幕後的問題,包括爲新字符指定編碼。
  2. Unicode並不告訴你字符是怎麼編碼成字節的。這是被編碼方案決定的,通過UTF來指定。
  3. 這個世界上從來沒有純文本這回事,如果你想讀出一個字符串,你必須知道它的編碼
  4. 字符集和編碼是不同的,字符集是指定的數字和字符的映射,而編碼則是將指定的字符對應的數字存儲在計算機中的過程。
  5. 編碼是很複雜的過程,其中涉及到的磚碼,基本平面,輔助平面等概念在本文中都沒有提到,具體的實現過程可以參考下面的阮一峯相關的資料。

參考資料:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章