什么是文本文件和文本编辑器
文本文件
文本文件是纯字符文件,它含有的所有字节必然能够采用某种字符集编码显示出字符,除了BOM字节。
字符集和换行符。
SUMMARY
作者:Keen Kwok
链接:https://www.zhihu.com/question/41426907/answer/90924168
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 字符集就是编码和字符的对应关系,比如说,在 ASCII 编码中,一个'A'字符对应'0x42'。不同的对应关系导致了不同字符集的出现。
- 字符编码就是字符在内存中的二进制显示(也可以理解为从理论到实践)。比如,'爱'这个的Unicode对应的字符编码为'0x7231',而使用UTF-8的编码方式,'爱'的字符编码(内存中存储数据格式)为'0xE788B1',UTF-16BE的字符编码为'0x7231'
默认是 ANSI
Windows早期(至少是95年以前的事情了)是ANSI字符集的,也就是说一个中文文本,在Windows简体中文版显示的是中文,到Windows日文版显示的就不知道是什么东西了。
后来,Windows支持了Unicode,但当时大部分软件都是用ANSI编码的,unicode还不流行,怎么办?Windows想了个办法,就是允许一个默认语言编码,就是当遇到一个字符串,不是unicode的时候,就用默认语言编码解释。(在区域和语言选项里可以改默认语言)
这个默认语言,在不同Windows语言版本里是不同的,在简体中文版里,是GBK,在繁体中文版里,是BIG5,在日文版里是JIS
而记事本的ANSI编码,就是这种默认编码,所以,一个中文文本,用ANSI编码保存,在中文版里编码是GBK模式保存的时候,到繁体中文版里,用BIG5读取,就全乱套了。
记事本也不甘心这样,所以它要支持Unicode,但是有一个问题,一段二进制编码,如何确定它是GBK还是BIG5还是UTF-16/UTF-8?记事本的做法是在TXT文件的最前面保存一个标签,如果记事本打开一个TXT,发现这个标签,就说明是unicode。标签叫BOM,如果是0xFF 0xFE,是UTF16LE,如果是0xFE 0xFF则UTF16BE,如果是0xEF 0xBB 0xBF,则是UTF-8。如果没有这三个东西,那么就是ANSI,使用操作系统的默认语言编码来解释。
Unicode的好处就是,不论你的TXT放到什么语言版本的Windows上,都能正常显示。而ANSI编码则不能。(UTF-8的好处是在网络环境下,比较节约流量,毕竟网络里英文的数据还是最多的)
概念区分:字符集和字符集编码
字符集:character set。 囊括某种或某几种文化的符号的集合,并且为这些符号分配一个唯一的数字编号。
字符集编码:character set encoding。把字符集内的每个符号的数字编号,按照某种规则,映射成二进制数值来存储到计算机,二进制数值并不一定要求等于数字编号。 encode & decode
ASCII
ASCII (American Standard Code for Information Interchange)
字符集:阿拉伯数字(0123456789),英文字母(a-z A-Z),英文符号(!@#$*等),控制打印机的字符,以上4种字符组成的字符集合。字符的数字编号范围是0-127.
字符集编码:一个字节,最高位恒0,其他位保持与数字编号相等。如 字符A -> 编号65 -> 编码01000001.
字符集编码和字符集编号的关系:字符集编码和字符集编号相等。
表示范围:0000 0000 - 0111 1111 (0X00 - 0X7F)
ASCII固定占用一个字节,最高位恒0,共计128个字符。33个字符是控制打印机动作的,称为控制字符,95个字符是可打印的,称为可见字符。
显示字符 | 控制字符 | |
---|---|---|
32-126 (阿拉伯数字,英文字母,符号) | 0-31 , 127 (控制字符) |
部分控制打印机的字符的解释如下:(有些控制字符随着IT发展和设备的进步,已经失去原有的意义或者其作用已经发生改变。)
NUL (0)
NULL,空字符。空字符起初本意可以看作为 NOP(中文意为空操作,就是啥都不做的意思),此位置可以忽略一个字符。
之所以有这个空字符,主要是用于计算机早期的记录信息的纸带,此处留个 NUL 字符,意思是先占这个位置,以待后用,比如你哪天想起来了,在这个位置在放一个别的啥字符之类的。
后来呢,NUL 被用于C语言中,表示字符串的结束,当一个字符串中间出现 NUL 时,就意味着这个是一个字符串的结尾了。这样就方便按照自己需求去定义字符串,多长都行,当然只要你内存放得下,然后最后加一个\0,即空字符,意思是当前字符串到此结束。
BEL (7)
BELl,响铃。在 ASCII 编码中,BEL 是个比较有意思的东西。BEL 用一个可以听得见的声音来吸引人们的注意,既可以用于计算机,也可以用于周边设备(比如打印机)。
注意,BEL 不是声卡或者喇叭发出的声音,而是蜂鸣器发出的声音,主要用于报警,比如硬件出现故障时就会听到这个声音,有的计算机操作系统正常启动也会听到这个声音。蜂鸣器没有直接安装到主板上,而是需要连接到主板上的一种外设,现代很多计算机都不安装蜂鸣器了,即使输出 BEL 也听不到声音,这个时候 BEL 就没有任何作用了。
LF (10)
Line Feed,直译为“给打印机等喂一行”,也就是“换行”的意思。LF 是 ASCII 编码中常被误用的字符之一。
LF 的最原始的含义是,移动打印机的头到下一行。而另外一个 ASCII 字符,CR(Carriage Return)才是将打印机的头移到最左边,即一行的开始(行首)。很多串口协议和 MS-DOS 及 Windows 操作系统,也都是这么实现的。
而C语言和 Unix 操作系统将 LF 的含义重新定义为“新行”,即 LF 和 CR 的组合效果,也就是回车且换行的意思。
从程序的角度出发,C语言和 Unix 对 LF 的定义显得更加自然,而 MS-DOS 的实现更接近于 LF 的本意。
现在人们常将 LF 用做“新行(newline)”的功能,大多数文本编辑软件也都可以处理单个 LF 或者 CR/LF 的组合了。
CR (13)
Carriage return,回车,表示机器的滑动部分(或者底座)返回。
CR 回车的原意是让打印头回到左边界,并没有移动到下一行的意思。随着时间的流逝,后来人们把 CR 的意思弄成了 Enter 键,用于示意输入完毕。
在数据以屏幕显示的情况下,人们按下 Enter 的同时,也希望把光标移动到下一行,因此C语言和 Unix 重新定义了 CR 的含义,将其表示为移动到下一行。当输入 CR 时,系统也常常隐式地将其
DEL (127)
Delete,删除。
有人也许会问,为何 ASCII 编码中其它控制字符的值都很小(即 0~31),而 DEL 的值却很大呢(为 127)?
这是由于这个特殊的字符是为纸带而定义的。在那个年代,绝大多数的纸带都是用7个孔洞去编码数据的。而 127 这个值所对应的二进制值为111 1111(所有 7 个比特位都是1),将 DEL 用在现存的纸带上时,所有的洞就都被穿孔了,就把已经存在的数据都擦除掉了,就起到了删除的作用。
Latin1
扩展的ASCII字符集,又称作 EASCII 和 ISO 8859-1
字符集:ASCII和欧洲字符组成的字符集合。字符的数字编号范围是0-255
字符集编码:一个字节,保持与数字编号相等。如字符 ß->编号223->编码1101 1111
字符集编码和字符集编号的关系:字符集和字符集编号相等。
ASCII只能覆盖英文符号,欧洲国家让最高位可为1,又扩展了128个字符,来存放欧洲国家的语言字符,如丹麦语,德语,法语,瑞典语等。
表示范围:0000 0000 - 1111 1111 (0X00 - 0XFF)。其中 0000 0000 - 0111 1111仍旧是ASCII字符,1000 0000 - 1111 1111表示扩展的欧国国家语言文化字符。
它兼容ASCII字符集。
[EASCII字符表
标签:编码,UTF,字节,字符,字符集,Unicode From: https://www.cnblogs.com/LiuwayLi/p/17481622.html