033_字符集和编码

1. 如需正确地显示html页面, 浏览器必须知道使用何种字符集。

2. 万维网早期使用的字符集是ASCII。ASCII支持0-9的数字, 大写和小写英文字母表, 以及一些特殊字符。

3. 由于很多国家使用的字符并不属于ASCII, 现代浏览器的默认字符集是ISO-8859-1。

4. 如果网页使用不同于ISO-8859-1的字符集, 就应该在<meta>标签进行指定。

5. 拉丁字母

5.1. 拉丁字母(罗马字母), 是目前世界上流传最广的字母体系, 源自希腊字母。

5.2. 起源

5.2.1. 拉丁文的字母约公元前7世纪~前6世纪时, 由希腊字母间接发展而来, 成为古罗马人的文字, 古罗马灭亡前共包含23个字母, 其中有18个辅音字母B、C、D、F、G、Z、H、K、L、M、N、P、Q、R、S、T、X、Y, 4个元音字母A、E、I、O, 和一个音值不定的V, 11世纪时增加了J、U、W, 形成了今天的26个字母。古代拉丁字母只有大写字母, 书写无标点。

5.3. 发展

5.3.1. 在早期的拉丁字母体系中并没有小写字母, 公元4世纪~7世纪的安塞尔字体和小安塞尔字体是小写字母形成的过渡字体。

5.3.2. 15世纪是欧洲文化发展极为重要的时期, 流传下来的罗马大写字体和卡罗琳小写字体通过意大利等国家的修改设计, 完美地融合在一起。

5.4. 1958年中华人民共和国颁布了以拉丁字母为基础制定的汉语拼音。

5.5. 使用情况

6. ASCII字符集

6.1. ASCII(American Standard Code for Information Interchange: 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统, 主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准, 并等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年, 最后一次更新则是在1986年, 到目前为止共定义了128个字符。

6.2. ASCII字符集的表达方式--ASCII码

6.2.1. ASCII码使用一个字节来编码ASCII字符集。 

6.2.2. ASCII码使用指定的7位二进制数组合来表示128种可能的字符。

6.2.3. 标准ASCII码也叫基础ASCII码, 使用7位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母, 数字0到9、标点符号, 以及在美式英语中使用的特殊控制字符。

6.3. ASCII标准表

6.4. ASCII可显示字符和不可显示字符

6.4.1. ASCII字符集可以分为可显示字符和不可显示字符。可显示字符所见即所得, 比较好理解。不可显示字符, 由于不可见, 所以相对难以理解。

6.4.2. ASCII码32~126为可显示字符。32是空格, 48~57为0到9十个阿拉伯数字, 65~90为26个大写英文字母, 97~122号为26个小写英文字母, 其余为一些标点符号、运算符号等。

6.4.3. ASCII码0~31及127(共33个)是控制字符或通信专用字符, 其实这33个都可以称之为控制字符, 只不过有的专门用于通信。如控制符: LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等。通信专用字符: SOH(文头)、EOT(文尾)、ACK(确认)等。它们并没有特定的图形显示, 但会依不同的应用程序, 而对文本显示有不同的影响。

6.5. ASCII控制字符中的空白字符

6.5.1. 控制字符中的空白字符有: 9是水平制表符(\t)、11是垂直制表符(\v)、12是换页键(\f)、13是回车键(\r)、10是换行键(\n)。空白字符还包括可见字符32是空格。

6.5.2. 空白字符在我们的正则表达式校验中经常使用。

6.5.3. 制表符的功能是在不使用表格的情况下在垂直方向按列对齐文本。

6.5.4. 水平制表符(\t), 可以通过我们键盘上的Tab键进行输入。制表符的宽度是灵活不固定的, 只不过大多数设备上水平制表符都预定义为四个空格的宽度。

6.5.5. 按一次tab键, 光标就自动定位到下一个制表符的位置, 而且在一个制表符宽度范围内, 增加或者删除文字不会影响下一制表符中的文字位置。

6.5.6. 垂直制表符(\v), 一般垂直制表符很不常用, 对于Java来说没有垂直制表符, 下面讲一下C标准中的水平制表符。它的作用是让'\v'后面的字符从下一行开始输出, 且开始的列数为'\v'前一个字符所在列后面一列。

6.5.7. 换页键(\f), 是用来控制打印机行为的。当打印机收到此键码的时候, 打印机移动到下一页。不同的设备的终端对此控制符所表现的行为各不同, 有些会清除屏幕, 有些只是显示FF字符, 有些是换新一页, 有些只是新换一行而已。例如: Unix/Linux下的Bash Shell和Tcsh就把FF 看做是一个清空屏幕的命令。

6.5.8. 控制字符(水平制表符、换行符和回车符除外)与html文档无关。

6.6 退格键(BS), 码值是8, 表示光标往回移动了一格, 同时也删除了移动后该位置的字符。效果跟我们按下键盘上的Backspace键是一样的。

6.7. ASCII响铃

6.7.1. 响铃(BEL), 码值是7, 是个比较有意思的东西。BEL用一个可以听得见的声音来吸引人们的注意, 既可以用于计算机, 也可以用于周边设备(比如打印机)。

6.7.2. 注意, BEL不是声卡或者喇叭发出的声音, 而是蜂鸣器发出的声音, 主要用于报警, 比如: 硬件出现故障时就会听到这个声音, 有的计算机操作系统正常启动也会听到这个声音。蜂鸣器没有直接安装到主板上, 而是需要连接到主板上的一种外设, 现代很多计算机都不安装蜂鸣器了, 即使输出BEL也听不到声音, 这个时候BEL就没有任何作用了。

6.8. ASCII空字符

6.7.1. 空字符(NULL), 码值是0。空字符起初本意可以看作为NOP(中文意为空操作, 就是啥都不做的意思), 此位置可以忽略一个字符。

6.8.2. 之所以有这个空字符, 主要是用于计算机早期的记录信息的纸带, 此处留个NUL字符, 意思是先占这个位置, 以待后用, 比如: 你哪天想起来了, 在这个位置在放一个别的啥字符之类的。

6.8.3. 后来呢, NUL被用于C语言中, 表示字符串的结束, 当一个字符串中间出现NUL时, 就意味着这个是一个字符串的结尾了。这样就方便按照自己需求去定义字符串, 多长都行, 当然只要你内存放得下, 然后最后加一个\0, 即空字符, 意思是当前字符串到此结束。

6.9. ASCII标题开始

6.9.1. 标题开始(SOH), 码值是1。如果信息沟通交流主要以命令和消息的形式的话, SOH就可以用于标记每个消息的开始。

6.10. ASCII正文开始和正文结束

6.10.1. 正文开始(STX), 码值是2。正文结束(ETX), 码值是3。

6.10.2. 通过某种通讯协议去传输的一个数据(包), 称为一帧的话, 常会包含一个帧头, 包含了寻址信息, 即你是要发给谁, 要发送到目的地是哪里, 其后跟着真正要发送的数据内容。

6.10.3. 而STX, 就用于标记这个数据正文的开始。接下来是要传输的数据, 最后是ETX, 表明数据正文的结束。

6.10.4. 而中间具体传输的数据内容, ASCII并没有去定义, 它和你所用的传输协议有关。

帧头

数据(数据内容可能包含多个数据块)

帧尾

SOH(表明帧头开始)

帧头信息, 比如: 包含了寻址信息, 即你是要发给谁, 要发送到目的地是哪里等等。

STX(表明数据开始)

真正要传输的数据。

ETB/ETX(表明数据结束)

EOT(传输结束)

6.11. ASCII码传输结束

6.11.1. 传输结束(EOT), 码值是4, 用于表示数据传输的结束。在电信和通信领域, EOT是发信方在传输结束时发送的信号或符号, 用来告知接收方一段信息已经完整接收。

6.11.2. 在计算机领域, 特别是在串行通信或控制协议中, EOT也经常被使用。它标志着一段数据或消息的结束, 使得接收方能够准确地知道何时数据已经完全接收, 从而进行后续的处理。

6.11.3. 在数据传输过程中, 通常会将数据封装成帧进行传输。每个帧包含帧头、帧数据和帧尾。帧头用于标识帧的开始, 而帧尾则用于标识帧的结束。然而, 在某些情况下, 为了简化数据传输过程, 可能会省略帧尾, 而使用EOT作为帧的结束标志。

6.11.4. 例如: 在某些通信协议中, 数据帧可能只包含帧头和数据部分, 而不包含显式的帧尾。在这种情况下, 发送方会在数据之后发送一个EOT字符, 以告知接收方数据的结束。接收方在接收到EOT字符后, 会知道当前帧的数据已经完整接收, 并可以进行相应的处理。

6.11.5. 需要注意的是, EOT本身并不包含任何实际的数据信息。它只是用于标识数据传输的结束, 以便接收方能够正确地解析和处理接收到的数据。

6.11.6. 总结来说, ASCII码中的EOT是一个用于表示数据传输结束的通信专用字符。在通信和计算机领域中, 它被广泛应用于标识数据帧的结束, 以确保数据的完整性和准确性。

6.12. ASCII码请求

6.12.1. 请求(ENQ), 码值是5, 通常用在数据通信中请求对方发送数据。然而, 在现代的网络通信中, 这种控制字符的使用已经相当罕见了。

6.13. ASCII码收到通知

6.13.1. 收到通知(ACK), 码值是6。在网络通信中, 特别是TCP(传输控制协议)中, ACK用于确认数据已经成功接受。

6.13.2. 例如: 一个客户端或者服务器, 成功接受到一个TCP段时, 它会回复一个ACK消息给发送方, 告诉它数据已经被成功接收。这有助于确保数据的完整性和可靠传输。

6.14. ASCII码数据链路转义

6.14.1. 数据链路转义(DLE), 码值是16。

6.14.2. 有时候我们需要在通信过程中发送一些控制字符, 但是总有一些情况下, 这些控制字符被看成了普通的数据流, 而没有起到对应的控制效果, ASCII编码引入DLE来解决这类问题。

6.14.3. 如果数据流中检测到了DLE, 数据接收端会对数据流中接下来的字符另作处理。但是具体如何处理, ASCII规范中并没有定义, 只是弄了个DLE去打断正常的数据流, 告诉接下来的数据要特殊对待。

6.15. ASCII码设备控制字符

6.15.1. 在ASCII码中, 设备控制字符是那些用于控制硬件设备的字符。设备控制1(DC1)、设备控制2(DC2)、设备控制3(DC3)和设备控制4(DC4)是这些控制字符中的一部分, 它们的十进制ASCII码值分别是17、18、19和20。

6.15.2. 设备控制1: 通常用于数据通信中的XON字符, 用于控制数据流的传输。其主要作用为, 在通信被控制符XOFF中断之后, 重新开始信息传输。在某些系统中, 它也可能用于其他设备控制功能。

6.15.3. 设备控制2: 通常用于数据通信中的XOFF字符, 用于暂停数据流的传输。这些字符与XON字符一起使用, 用于实现数据流的流量控制。

6.15.4. 设备控制3: 在ASCII编码中, 这个字符通常被用作回车(CR, Carriage Return)字符。在文本文件中, 它用于将光标移动到当前行的开头, 以便开始写入新的一行。

6.15.5. 设备控制4: 这个字符通常被用作换行(LF, Line Feed)字符。在文本文件中, 它用于将光标移动到下一行的开头, 从而开始新的一行。

6.15.6. 需要注意的是, 这些设备控制字符的确切用途可能会因操作系统、硬件设备和软件应用程序的不同而有所差异。在某些上下文中, 这些字符可能具有不同的用途或意义。因此, 在编写涉及这些字符的代码或处理包含这些字符的数据时, 最好查阅相关的文档或规范, 以确保正确理解和使用这些字符。

6.16. ASCII码拒绝接收

6.16.1. 拒绝接收(NAK), 码值是21。通常用于数据通信和串行通信中。

6.16.2. NAK(Negative Acknowledgment), 否定应答。在串行通信中, NAK通常用于错误控制, 当接收方检测到数据错误时, 会发送NAK字符作为对发送方的应答, 表示接收方未能正确接收数据, 并请求发送方重新发送, 以确保数据的正确传输。

6.17. ASCII码同步空闲

6.17.1. 同步空闲(SYN), 码值是22, 用于数据通信。在TCP/IP协议中, SYN是一个标志位, 用于TCP连接的建立和管理。在TCP三次握手过程中, SYN标志位起着关键的作用。

6.17.2. SYN=1, ACK=0: 这是一个连接请求报文段。当客户端想要与服务器建立连接时, 它会发送一个SYN=1, ACK=0的数据包。

6.17.3. SYN=1, ACK=1: 这是一个连接确认报文段。当服务器收到客户端的连接请求后, 它会发送一个SYN=1, ACK=1的数据包作为响应, 表示它已准备好进行连接。

6.17.4. SYN=0, ACK=1: 这是一个连接建立报文段。当客户端收到服务器的确认后, 它会发送一个SYN=0, ACK=1的数据包, 表示连接已建立。

6.17.5. SYN标志位的主要目的是确保TCP连接的双方能够正确地同步和确认彼此的存在。

6.18. ASCII码结束传输块

6.18.1. 结束传输块(ETB), 码值是23, 用于数据通信中, 用于标记数据块的结束。

6.19. ASCII码取消

6.19.1. 取消(CAN), 码值是24。"Cancel"字符通常用于文本终端中, 以取消当前正在进行的操作或命令。但请注意, 现代操作系统和终端软件可能不再支持或识别此字符。

6.20. ASCII码媒介结束

6.20.1. 媒介结束(EM), 码值是25。已到介质末端, 介质存储已满。

6.20.2. EM用于, 当数据存储到达串行存储介质末尾的时候, 就像磁带或磁头滚动到介质末尾一样。其用于表述数据的逻辑终点, 即不必非要是物理上的达到数据载体的末尾。

6.21. ASCII码不用切换和启用切换

6.21.1. 不用切换(SO), 码值是14。启用切换(SI), 码值是15。

6.21.2. 早在1960年代, 设计ASCII编码的美国人就已经想到了, ASCII编码不仅仅能用于英文, 也要能用于外文字符集, 这很重要, 定义Shift In和Shift Out正是考虑到了这点。

6.21.3. 最开始, 其意为在西里尔语和拉丁语之间切换。西里尔语ASCII(也即KOI-7编码)将Shift作为一个普通字符, 而拉丁语ASCII(也就是我们通常所说的ASCII)用Shift去改变打印机的字体, 它们完全是两种含义。

6.21.4. 在拉丁语ASCII中, SO用于产生双倍宽度的字符(类似于全角), 而用SI打印压缩的字体(类似于半角)。

6.22. ASCII码文件分隔

6.22.1. 文件分隔(FS), 码值是28。这个字符在早期的计算机系统中, 特别是那些依赖于顺序存储介质(如穿孔卡片、纸带、磁带等)的系统中, 起到了非常重要的作用。

6.22.2. 文件边界标记: FS的主要用途是标记文件的结束。在早期的串行通信和存储系统中, 当数据存储到达串行存储介质的末尾时, FS被用来表示数据的逻辑终点, 即使物理上并没有到达数据载体的真正末尾。

6.22.3. 文件分割: 在串行通信中, FS也用于分割两个单独的文件。当系统读取到FS时, 它会知道当前文件已经结束, 并开始寻找下一个文件的开始。

6.22.4. 在计算机科学的早期阶段, 大部分的数据存储和传输都是顺序的、串行的, 而不是像现在这样的随机访问。设计ASCII编码时, 考虑到这一点, 人们引入了FS这样的控制字符来帮助计算机系统更好地组织和理解数据。

6.22.5. 在现代计算机系统中, 由于随机访问存储介质(如RAM、磁盘等)的普及, FS和其他控制字符的使用已经变得非常罕见。然而, 在某些特定的应用场景(如某些文本编码格式或通信协议)中, 这些控制字符仍然可能会被用到。

6.22.6. 总的来说, FS文件分割符是ASCII编码中的一个重要组成部分, 它帮助早期的计算机系统更好地理解和组织数据。虽然在现代计算机系统中, 它的使用已经大大减少, 但对于理解计算机科学的历史和发展仍然具有重要意义。

6.23. ASCII码分组符

6.23.1. 分组符(GS), 码值是29, 用于分隔串行数据存储系统中的不同组。

6.23.2. 大部分情况下, 数据库的建立都和表有关, 表包含了多条记录。同一个表中的所有记录属于同一类型, 不同的表中的记录属于不同的类型。

6.23.3. 而分组符GS就是用来分隔串行数据存储系统中的不同的组。值得注意的是, 当时还没有使用Excel表格, ASCII时代的人把它叫做组。

6.24. ASCII码记录分隔符

6.24.1. 记录分隔符(RS), 码值是30, 用于分隔在一个组或表内的多个记录。

6.25. ASCII码单元分隔符

6.25.1. 单元分隔符(US), 码值是31。

6.25.2. 在ASCII定义中, 数据库中所存储的最小的数据项叫做单元(Unit)。而现在我们称其字段(Field)。单元分隔符US用于分割串行数据存储环境下的不同域。

6.25.3. 现在的数据库实现都要求大部分类型都拥有固定的长度, 尽管有时候可能用不到, 但是对于每一个字段, 却都要分配足够大的空间, 用于存放最大可能的数据。

6.25.4. 这种做法的弊端就是占用了大量的存储空间, 而US控制符允许字段具有可变的长度。在1960年代, 数据存储空间很有限, 用US将不同单元分隔开, 能节省很多空间。

6.26. ASCII码换码/溢出

6.26.1. 换码/溢出(ESC, escape), 码值是27。是ASCII标准的首创的, 由Bob Bemer提议的。用于开始一段控制码的扩展字符。如此, 即能够不必将全部可能想得到的控制字符都放到ASCII标准中了。

6.26.2. 由于, 新的技术可能须要新的控制命令。而ESC能够用作这些字符命令的起始标志。

6.26.3. ESC广泛用于打印机和终端。去控制设备设置, 比方: 字体、字符位置和颜色等等。

6.26.4. 假设最开始的ASCII标准中, 未定义ESC, 预计ASCII标准早就被其它标准所替代了。由于其没有包括这些新出现的字符, 所以肯定会有其它新的标准出现。用于表示这些字符的。

6.26.5. 即, ESC给开发人员提供了, 能够依据须要而定义新含义的字符的可能。

6.27. ASCII码删除

6.27.1. 删除(DEL), 码值是127。这个字符在早期的计算机系统中, 特别是当数据存储空间有限的时候, 被用作删除操作。

6.27.2. 纸带数据删除: 在1960年代, 许多计算机系统使用纸带作为数据存储介质。这些纸带通常有7个孔洞, 用于编码数据。DEL字符的二进制表示是1111111(所有7个比特位都是1)。当DEL字符用于纸带时, 它会导致纸带上所有的孔洞都被穿孔, 从而擦除已经存在的数据, 实现删除操作。

6.27.3. 需要注意的是, 随着计算机技术的发展和数据存储空间的增加, DEL字符在现代计算机系统中的用途已经发生了变化。在现代操作系统和编程语言中, DEL通常不再用于删除操作, 而是作为控制字符之一, 用于特定的上下文或协议中。

6.28. ASCII码代替

6.28.1. 代替(SUB), 码值是26, 对应字符Ctrl+Z。在早期的计算机系统中, 这个字符被用作文件结束的标志, 称为EOF(End Of File)。

6.28.2. 0x1A(Ctrl+Z)在ASCII码中的具体用途取决于它被使用的上下文和操作系统。在一些系统中, 它可能被用作文件结束的标志; 在其他系统中, 它可能有其他的用途或根本不被使用。

7. 问题编辑

7.1. 在英语中, 用128个符号编码便可以表示所有, 但是用来表示其他语言, 128个符号是不够的。比如: 在法语中, 字母上方有注音符号, 它就无法用ASCII 码表示。于是, 一些欧洲国家就决定, 利用字节中闲置的最高位编入新的符号。比如: 法语中的é的编码为130(二进制10000010)。这样一来, 这些欧洲国家使用的编码体系, 可以表示最多256个符号。

7.2. 但是, 这里又出现了新的问题。不同的国家有不同的字母, 因此, 哪怕它们都使用256个符号的编码方式, 代表的字母却不一样。比如: 130在法语编码中代表了é, 在希伯来语编码中却代表了字母Gimel (ג), 在俄语编码中又会代表另一个符号。但是不管怎样, 所有这些编码方式中, 0-127表示的符号是一样的, 不一样的只是128-255的这一段。

7.3. 至于亚洲国家的文字, 使用的符号就更多了, 汉字就多达10万左右。一个字节只能表示256种符号, 肯定是不够的, 就必须使用多个字节表达一个符号。比如: 简体中文常见的编码方式是 GB2312, 使用两个字节表示一个汉字, 所以理论上最多可以表示: 256 x 256 = 65536个符号。

8. ISO字符集

8.1. ISO字符集是国际标准组织(ISO)针对不同的字母表/语言定义的标准字符集。

8.2. 下面列出了世界各地使用的不同字符集:

9. ISO-8859-1

9.1. ISO-8859-1编码是单字节编码, 向下兼容ASCII, 其编码范围是0x00-0xFF, 0x00-0x7F之间完全和ASCII一致, 0x80-0x9F之间ISO-8859-1未定义, 0xA0-0xFF之间是文字符号。

9.2. 此字符集支持部分欧洲使用的语言, 包括阿尔巴尼亚语、巴斯克语、布列塔尼语、加泰罗尼亚语、丹麦语、荷兰语、法罗语、弗里西语、加利西亚语、德语、格陵兰语、冰岛语、爱尔兰盖尔语、意大利语、拉丁语、卢森堡语、挪威语、葡萄牙语、里托罗曼斯语、苏格兰盖尔语、西班牙语及瑞典语。

9.3. ASCII编码是一个7位的容器, ISO-8859-1编码是一个8位的容器。

9.4. ISO-8859-1的较低部分(从1到127之间的代码)是最初的7比特ASCII。

10. 汉字编码

10.1. GB2312、GBK是汉字字符编码方案的国家标准。

10.2. GB2312是1980年制定的中国汉字编码国家标准。共收录7445个字符, 其中汉字6763个。GB2312兼容标准ASCII码, 采用扩展ASCII码的编码空间进行编码, 一个汉字占用两个字节, 每个字节的最高位为1。

10.3. GBK于1995年制定, 使用双字节编码, 编码空间为0x8140~0xFEFE, 收录了21003个汉字。GBK向下与GB2312编码兼容, 向上支持ISO 10646.1国际标准, 是前者向后者过渡过程中的一个承上启下的产物。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值