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。 总结: Unicode是一个简单的标准,用来把字符映射到数字上。Unicode协会的人会帮你处理所有幕后的问题,包括为新字符指定编码。Unicode并不告诉你字符是怎么编码成字节的。这是被编码方案决定的,通过UTF来指定。这个世界上从来没有纯文本这回事,如果你想读出一个字符串,你必须知道它的编码字符集和编码是不同的,字符集是指定的数字和字符的映射,而编码则是将指定的字符对应的数字存储在计算机中的过程。编码是很复杂的过程,其中涉及到的砖码,基本平面,辅助平面等概念在本文中都没有提到,具体的实现过程可以参考下面的阮一峰相关的资料。参考资料: 字符编码笔记:ASCII,Unicode 和 UTF-8 阮一峰学点编码知识又不会死:Unicode的流言终结者和编码大揭秘javascript基础之字符集与编码Unicode与JavaScript详解 阮一峰

August 7, 2019 · 1 min · jiezi

字符编码那些事儿

身为一名要冲出国门的国际化码农????,字符编码是必备课题。小拽本文依次介绍下字节,ASCII,GB2312,GBK,GB18030,UNICODE,UTF8,UTF16,ICU 等到底是什么鬼?最后理论结合实际,研究下网站中经常出现的“锟斤拷,��,烫烫烫烫烫,屯屯屯屯屯屯”是什么神兵利器O(∩_∩)O?一、二进制和字节大概一百多年前,贝尔实验室制造了世界上的第一个晶体管,晶体管具有开合(0和1)的状态,这种01状态的变化被称为二进制位(bit)。 过了几年,英特尔把八个可以开合的晶体管组合,做为一个基本的记录单元,这个单元被称作字节(byte),所以一个byte由8个bit构成,可以表达256种状态。 又过几年,祖师爷冯诺依曼设计了一台可以存储和处理(冯诺依曼体系)字节变动的机器ENIAC,后来这个机器被称作计算机。 二、标准ASCII计算机运行是二进制,如何用二进制位来标识人类语言,就需要和计算机有一套约定关系。例如约定,0100 1111代表O,0100 1011代表K,那么存储为01001111 01001011的两个字节就代表OK,这套约定关系被称作字符编码。 冯祖师爷是的德国人,二战去了美国设计了第一台计算机。起初,只有美国人能用计算机,山姆大叔就根据英语习惯设计了一套映射约定 0-31 标识控制字符,例如换行[LF],删除[DEL],确认[ACK]等32-47 标识符号例如!@#$等48-57 标识0-9是个阿拉伯数字65-122 标识大小写字母大家都按着这个约定来,交流表达起来没啥问题,呵呵,都挺好。于是这个方案就一致通过了,山姆大叔也给这个约定起了个名字ASCII编码(American Standard Code for Information Interchange,美国信息互换标准代码)。当时世界上所有的计算机都用同样的ASCII方案来保存英文字符。 计算机一个标准字节8bit本身可以标识256个符号,但标准的ASCII的最高位去掉用做奇偶校验,用剩余7位标识128个符号,如下图 三、ASCII 扩展字符集随着计算机的发展,欧洲人开始逐步接触计算机了。 英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。比如在法语中,字母上方有注音符号,它就无法用ASCII码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。 IBM牵头扩充了ASCII编码128-256位的标识字符,主要是一些欧洲的常用符号,这部分扩展映射被称为ASCII扩展字符集 四、GB2312雄关漫道真如铁,而今迈步从头越,美帝国主义万万没有想到,二战后,大量第三世界的人民站起来了,逐步开始使用计算机。但问题是256个字符已经没啥可利用的字节状态来表示汉字了,更何况中华文明有6000多个常用汉字需要保存呢。 但是这难不倒智慧的中国人民,面对帝国主义的压迫,我们毫不客气的做了两件事情,并在1980年发表了这个声明 互相尊重:尊重标准ASCII 规范中0-127位表示的标准字符。平等互利:ASCII的128-256位,我们用来标识中文,由于中文太多,我们要使用两个字节来表示一个中文^_^中国人民觉的这个声明还不错,毕竟当时计算机的使用范围也不大,基本满足需求,于是就把这种汉字方案叫做 GB2312编码。GB2312 是对 ASCII 的中文扩展。 非专业人士可以忽略: GB2312如何组合,能表示多少个?GB2312中用两个字节来标识一个汉字,前面的一个字节(他称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,简单计算0xA1:10*16 + 1 = 161 0xF7:15*16 + 7 = 247 => 247-161 = 860xFE:15*16 + 14= 254 => 254-161 = 93因此GB2312可以标识约86*93=7998 个汉字实时上 GB2312 标准共收录 6763 个汉字,其中一级汉字 3755 个,二级汉字 3008 个。同时收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的 682 个字符。几乎覆盖了大陆常用的99.75%汉字这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的全角字符,而原来在127号以下的那些就叫半角字符了。 ...

May 12, 2019 · 2 min · jiezi