摘要:下文件名長(zhǎng)度限制出現(xiàn)場(chǎng)景在迭代中有一個(gè)需求是將文件名修改為所有班級(jí)的名稱集合,出現(xiàn)的班級(jí)過(guò)多導(dǎo)致的文件名過(guò)長(zhǎng)在下無(wú)法創(chuàng)建文件和文件夾的情況解決方式經(jīng)過(guò)查證,中文件名最長(zhǎng)為字符,文件路徑最大長(zhǎng)度為字符。這是被編碼方案決定的,通過(guò)來(lái)指定。
Linux下文件名長(zhǎng)度限制
出現(xiàn)場(chǎng)景:在迭代中有一個(gè)需求是將pdf文件名修改為所有班級(jí)的名稱集合,出現(xiàn)的班級(jí)過(guò)多導(dǎo)致的文件名過(guò)長(zhǎng)在linux下無(wú)法創(chuàng)建文件和文件夾的情況解決方式:經(jīng)過(guò)查證,linux中文件名最長(zhǎng)為255字符,文件路徑最大長(zhǎng)度為4096字符。所以需要對(duì)班級(jí)名稱進(jìn)行截?cái)啵⑶也粌H僅是根據(jù)字符串長(zhǎng)度截?cái)啵歉鶕?jù)每一個(gè)字母或者漢字對(duì)應(yīng)的字符來(lái)計(jì)算得到最后的文件名小于255個(gè)字符。
鑒于以上場(chǎng)景,于是進(jìn)行稍微的深究,對(duì)字符編碼相關(guān)的知識(shí)進(jìn)行了一個(gè)深一步的學(xué)習(xí)
字符
簡(jiǎn)介:字符簡(jiǎn)單的來(lái)說(shuō)就是我們?nèi)粘I钪杏玫降囊恍┳址热鐢?shù)字、漢字、標(biāo)點(diǎn)符號(hào)等。專業(yè)的介紹可以參考百度百科)
字節(jié)
簡(jiǎn)介:計(jì)算機(jī)中的一個(gè)計(jì)量存儲(chǔ)容量的單位,常見(jiàn)的計(jì)算機(jī)中一個(gè)字節(jié)代表八位的二進(jìn)制數(shù)
編碼
簡(jiǎn)介:其實(shí) 編碼 就是將字符轉(zhuǎn)為二進(jìn)制的規(guī)則,因?yàn)槲覀冎烙?jì)算機(jī)是通過(guò) 高電平 和 低電平 來(lái)分別代表 1 和 0,想讓計(jì)算機(jī)讀懂我們的字符,就需要將 二進(jìn)制數(shù) 和我們的字符建立一個(gè)映射關(guān)系,這個(gè)過(guò)程就叫編碼。其實(shí)每個(gè)人都可以定義自己的編碼規(guī)則,但是這樣就亂套了。所以一些組織就制定了統(tǒng)一的編碼規(guī)則。也就出現(xiàn)了我們常見(jiàn)的 ASCII 、unicode 等編碼規(guī)則
字符集
ASCII(字符集):建立了128個(gè)字符對(duì)應(yīng)的數(shù)字編號(hào),僅支持英文字母、一些標(biāo)點(diǎn)符號(hào)、以及一些不可顯示的字符。
unicode (萬(wàn)國(guó)碼 字符集):Unicode只是一個(gè)用來(lái)映射字符和數(shù)字的標(biāo)準(zhǔn)。它對(duì)支持字符的數(shù)量沒(méi)有限制,也不要求字符必須占兩個(gè)、三個(gè)或者其它任意數(shù)量的字節(jié)。Unicode并不涉及字符是怎么在字節(jié)中表示的,它僅僅指定了字符對(duì)應(yīng)的數(shù)字。歸根結(jié)底,unicode就是把世界上所有的字符都和一個(gè)數(shù)字做對(duì)應(yīng),但是具體到這個(gè)數(shù)字在計(jì)算機(jī)中如何表示,他是不管的。
關(guān)于Unicode的其它誤解包括:Unicode支持的字符上限是65536個(gè),Unicode字符必須占兩個(gè)字節(jié),這些都不正確。Unicode字符是怎樣被編碼成內(nèi)存中的字節(jié)這是另外的話題,它是被UTF(Unicode Transformation Formats)定義的。
unicode的問(wèn)題:比如,漢字嚴(yán)的 Unicode 是十六進(jìn)制數(shù)4E25,轉(zhuǎn)換成二進(jìn)制數(shù)足足有15位(100111000100101),也就是說(shuō),這個(gè)符號(hào)的表示至少需要2個(gè)字節(jié)。表示其他更大的符號(hào),可能需要3個(gè)字節(jié)或者4個(gè)字節(jié),甚至更多。
這里就有兩個(gè)嚴(yán)重的問(wèn)題,第一個(gè)問(wèn)題是,如何才能區(qū)別 Unicode 和 ASCII ?計(jì)算機(jī)怎么知道三個(gè)字節(jié)表示一個(gè)符號(hào),而不是分別表示三個(gè)符號(hào)呢?第二個(gè)問(wèn)題是,我們已經(jīng)知道,英文字母只用一個(gè)字節(jié)表示就夠了,如果 Unicode 統(tǒng)一規(guī)定,每個(gè)符號(hào)用三個(gè)或四個(gè)字節(jié)表示,那么每個(gè)英文字母前都必然有二到三個(gè)字節(jié)是0,這對(duì)于存儲(chǔ)來(lái)說(shuō)是極大的浪費(fèi),文本文件的大小會(huì)因此大出二三倍,這是無(wú)法接受的。于是出現(xiàn)了對(duì)unicode字符集的不同的編碼方式
常見(jiàn)的編碼規(guī)則
ASCII碼的編碼規(guī)則:每個(gè)二進(jìn)制位(bit)有 0 1 兩個(gè)狀態(tài),因此八個(gè)二進(jìn)制位就能夠組成 256 種不同的狀態(tài),也就是 00000000 - 11111111,由于ASCII字符集定義了128個(gè)字符,八個(gè)二進(jìn)制位能夠表達(dá) 256 個(gè)狀態(tài),所以肯定是夠用了,所以在 ASCII 碼中一個(gè)字符只占一個(gè)字節(jié)(一個(gè)字節(jié) === 8 bit)
UTF-8:是一種unicode的編碼方案,在UTF-8中,0-127號(hào)的字符用1個(gè)字節(jié)來(lái)表示,使用和US-ASCII相同的編碼。這意味著1980年代寫(xiě)的文檔用UTF-8打開(kāi)一點(diǎn)問(wèn)題都沒(méi)有。只有128號(hào)及以上的字符才用2個(gè),3個(gè)或者4個(gè)字節(jié)來(lái)表示。因此,UTF-8被稱作可變長(zhǎng)度編碼,它可以使用1~4個(gè)字節(jié)表示一個(gè)符號(hào),根據(jù)不同的符號(hào)而變化字節(jié)長(zhǎng)度。
UTF-16:另一個(gè)流行的可變長(zhǎng)度編碼方案是UTF-16,它使用2個(gè)或者4個(gè)字節(jié)來(lái)存儲(chǔ)字符。
javascript中的字符編碼
js中用的編碼方式不是UTF-8、UTF-16。而是 UCS-2,具體原因是因?yàn)閖avascript誕生的時(shí)候,還沒(méi)有UTF-16,但是好在UCS的碼點(diǎn)和unicode一致,所以他們是互相兼容的。兩者的關(guān)系簡(jiǎn)單說(shuō),就是UTF-16取代了UCS-2,或者說(shuō)UCS-2整合進(jìn)了UTF-16。所以,現(xiàn)在只有UTF-16,沒(méi)有UCS-2。
總結(jié):
Unicode是一個(gè)簡(jiǎn)單的標(biāo)準(zhǔn),用來(lái)把字符映射到數(shù)字上。Unicode協(xié)會(huì)的人會(huì)幫你處理所有幕后的問(wèn)題,包括為新字符指定編碼。
Unicode并不告訴你字符是怎么編碼成字節(jié)的。這是被編碼方案決定的,通過(guò)UTF來(lái)指定。
這個(gè)世界上從來(lái)沒(méi)有純文本這回事,如果你想讀出一個(gè)字符串,你必須知道它的編碼
字符集和編碼是不同的,字符集是指定的數(shù)字和字符的映射,而編碼則是將指定的字符對(duì)應(yīng)的數(shù)字存儲(chǔ)在計(jì)算機(jī)中的過(guò)程。
編碼是很復(fù)雜的過(guò)程,其中涉及到的磚碼,基本平面,輔助平面等概念在本文中都沒(méi)有提到,具體的實(shí)現(xiàn)過(guò)程可以參考下面的阮一峰相關(guān)的資料。
參考資料:
字符編碼筆記:ASCII,Unicode 和 UTF-8 阮一峰
學(xué)點(diǎn)編碼知識(shí)又不會(huì)死:Unicode的流言終結(jié)者和編碼大揭秘
javascript基礎(chǔ)之字符集與編碼
Unicode與JavaScript詳解 阮一峰
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/106494.html
閱讀 3296·2021-11-24 09:39
閱讀 2805·2021-10-12 10:20
閱讀 1908·2019-08-30 15:53
閱讀 3076·2019-08-30 14:14
閱讀 2600·2019-08-29 15:36
閱讀 1121·2019-08-29 14:11
閱讀 1956·2019-08-26 13:51
閱讀 3408·2019-08-26 13:23