搜索
首页开发工具notepadWindows Notepad里可选的字符编码的详细介绍

Windows Notepad里可选的字符编码的详细介绍

Sep 27, 2018 pm 05:40 PM
unicodewindows记事本

本篇文章给大家带来的内容是关于Windows Notepad里可选的字符编码的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

Windows Notepad(记事本)中保存文件的编码选项都是什么意思……

这篇文章就简单测试一下Windows Notepad的行为。

577da6f42fb583f2b1883ad889098b9b_articlex.jpg

Windows Notepad的编码包含ANSI、Unicode、Unicode big endian和UTF-8。

警告

本文仅仅阐述一个广泛使用的软件的技术事实,不代表作者支持或反对使用该软件。
事实上作者推荐任何时候都不使用 Windows Notepad 来处理计算机程序代码。
本文仅在某一个简体中文版64位Windows 7的实例下验证,仅供参考。不保证在其他相同或相异系统下能够重现一致的结果。

注意

本文严格区分Unicode的编码字节序列化
Unicode的编码仅指使用数(通常写成16进制数)来一对一的代表字符的工作。这个数的范围仅受Unicode标准的约束,与计算机毫无关联。
Unicode的字节序列化指为了能够写入计算机存储器,而把一个Unicode标准范围内的数,表示成N个字节的工作。

测试用例

测试用例为:“锟斤拷【断行】a【断行】”。(锟斤拷是一种信仰。)

所有字符的GBK和Unicode编码为:

  • 锟 GBK=EFBF Unicode=U+951F

  • 斤 GBK=BDEF Unicode=U+65A4

  • 拷 GBK=BFBD Unicode=U+62F7

以下ASCII字符的GBK和Unicode编码与ASCII一致:

a=0x61 CR=0x0D LF=0x0A
 (Windows一个换行符占有两个字符:CR+LF)

ANSI

在简体中文系统下,ANSI就是中华人民共和国国家标准定义的GBK编码。

Windows Notepad使用ANSI存储这个文件的结果如下:

EF BF  BD EF  BF BD  0D  0A  61  0D  0A
-----  -----  -----  --  --  --  --  --

简单的使用GBK编码存储了所有的字符。最高位不是1的单字节并等同于ASCII,否则双字节。

这里要注意字节序(Endian)的问题[注A]。可以看到这里的字节序是大端在先(big-endian)的。

但是不必特意强调“大端在先的GBK”——因为从GB2312开始,标准就规定了存储方式是大端在先的[注B]。后来的GBK和GB18030-2000向下兼容。

ANSI的麻烦就是依赖系统——其他语言系统的ANSI就不是GBK了,打开GBK的文件必然乱码。并且GBK的字符集本身也太小。
(千万不要说“我只用中文”——少了Unicode那些符号,网上那些颜文字都打不出来)

Unicode系列

Windows Notepad所说的“Unicode”、“Unicode big endian”和UTF-8,全都是同样的Unicode编码的不同的字节序列化存储方法。

UTF-16 和 BOM

这里的Unicode指UTF-16[注C]。UTF-16是极其简单粗暴的序列化方法——绝大多数的Unicode字符都在U+0000~U+FFFF的范围内[注D],那就每个字符用两个字节,把Unicode编码的原始值写盘。

注意ASCII字符也必须浪费一倍的空间存储高8位的0x00——因为如果把高8位的0略了,解析时就再也没有其他的依据去断字。

对于UTF-16就存在大端和小端的问题了——UTF-16并不规定字节的大端在前还是小端在前。但UTF-16并不包含表示字节序的信息,总不能人工看看哪个解析是不乱码的吧……

Unicode提供的解决方式是,把一个零宽无断字空格符U+FEFF ZERO WIDTH NO-BREAK SPACE)以UTF-16的方式序列化之后,塞到文件的最前边。这样UTF-16解析器读取文件的前两个字节,如果是FE FF就是大端在前,FF FE就是小端在前。

这个塞进去的东西就叫BOM(Byte Order Mark,字节顺序标记)。

值得一提的是,零宽无断字空格符也常用于充当1个有效字符,破拆各种场合的字数限制。包括SegmentFault的问答和评论内容在内。

记事本的“Unicode”和“Unicode big endian”

单写“Unicode”,根本就不是一种存储方法的完整表达。因为这只包含编码而没有字节序列化

M$出现这种错误,我一点都不觉得奇怪。死记结论就可以了:Windows Notepad的“Unicode”就是UTF-16

Windows Notepad使用“Unicode” = 小端在先的UTF-16,存储这个文件的结果如下:

 FF FE 1F 95 A4 65 F7 62 0D 00 0A 00 61 00 0D 00 0A 00
 -BOM- ----- ----- ----- ----- ----- ----- ----- ----- 
U+FEFF  951F  65A4  62F7  000D  000A  0061  000D  000A <--Unicode原始值

Windows Notepad使用“Unicode big endian” = 大端在先的UTF-16,存储这个文件的结果如下:

 FE FF 95 1F 65 A4 62 F7 00 0D 00 0A 00 61 00 0D 00 0A
 -BOM- ----- ----- ----- ----- ----- ----- ----- ----- 
U+FEFF  951F  65A4  62F7  000D  000A  0061  000D  000A <--Unicode原始值

UTF-8

UTF-8是一种用1~4个字节表示1个Unicode字符的变长的字节序列化方法。具体的实现细节看这篇文章。UTF-8的好处在于:

  1. 无论是IETF的推荐,还是实际业界的执行,UTF-8都是互联网的标准。

  2. 向下兼容,ASCII字符UTF-8序列化后仍是原样,任何ASCII文件也是有效的UTF-8文件。

  3. 没有字节序问题。UTF-8的字节序是由RFC3629定死的。

Windows Notepad使用UTF-8存储这个文件的结果如下:

 EF BB BF  E9 94 9F  E6 96 A4  E6 8B B7  0D   0A   61   0D   0A
 --BOM---  --------  --------  --------  --   --   --   --   --
U+ FEFF      951F      65A4      62F7   000D 000A 0061 000D 000A <--Unicode原始值

注意UTF-8前边仍然塞进去了U+FEFF按照UTF-8序列化的结果EF BB BF,作为前边提到过的BOM字节顺序标记。Windows Notepad存储的UTF-8,是带有BOM标记的UTF-8

但是如果仅仅对于UTF-8而言,字节序是没有意义的。因为UTF-8的字节序被规范写死,U+FEFF编码后必然得到EF BB FF,得不出其他的。没有二义性,BOM就失去了原本的意义。也许只有区别UTF-8文件和UTF-16文件的用处……

如何对待UTF-8文件的BOM,RFC3629的第6章有详细的规定,不加详述。

值得一提的是,BOM我想很多PHP程序员都经历过并且恨之入骨——PHP不认识文件中的BOM头并会将其作为HTTP Response的正文送出。这甚至在无缓冲的情况下,会导致header()等必须在Response开始前执行的函数直接失效。

所以PHP程序员总是会喜欢UTF-8 without BOM的编码方式——这基本也就宣布了Windows下的PHP开发,Windows Notepad完全的淘汰出局,哪怕是任何一星半点代码的临时修改。

番外:Notepad++的字符编码测试

ANSI没有区别,但Notepad++支持选择多国编码的不同ANSI编码方式(类似浏览器里选编码),可以轻松生成或读取Shift-JIS等其他字符集的文件。适合用于对付日文老游戏的README等文档。

UCS-2 Big Endian、UCS-2 Little Endian和前边UTF-16的两个例子一致。注意UTF-16的文件不提供“无BOM”的存储方法(提供了就坏了)。

UTF-8仍然代表“带有BOM标记的UTF-8”。但同时提供PHP程序员最爱的UTF-8 without BOM,就像:

 E9 94 9F  E6 96 A4  E6 8B B7  0D   0A   61   0D   0A
 --------  --------  --------  --   --   --   --   --
U+ 951F      65A4      62F7   000D 000A 0061 000D 000A <--Unicode原始值

Simple and clean.

注解
[注A] 对于一个双(多)字节的数,一定会按8位截断为1字节后写盘。那么写盘时先写最低8位还是先写最高8位,就是所谓的“字节序”(Endian)问题。例如,数0x01020304写盘时,是先写最低8位的04 03 02 01,还是先写最高8位的01 02 03 04?
 先写低8位的叫做小端在先(little-endian),先写高8位的叫做大端在先(big-endian)。实际采用何种字节序受系统环境、标准规范和软件实际编写的多方面控制,不一概而论。
[注B] 字节序如果我没弄错,是GB2312采用的EUC字符编码方法控制的。
[注C] 本文并不严格区分UTF-16与UCS-2。
[注D] Unicode的最大值实际上达到了U+10FFFF,超出了两个字节能够存储的限度。
 但Unicode由于历史原因,留下了U+D800~U+DFFF这一段永久保留不用的空缺区域。
 因此对U+10000及以上的字符,UTF-16借助了这部分空缺区域,对这些编码超大的字符打破2字节16位的惯例,特别的用4字节32位去表示之。
 这一部分编码值太大的字符,超出了GBK的字符集范围,因此本文将完全忽略。如有机会再进一步测试。

以上是Windows Notepad里可选的字符编码的详细介绍的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
记事本:了解财务模型记事本:了解财务模型Apr 19, 2025 am 12:11 AM

记事本conversitsitselffinanclythanclythancloughdonations,赞助和apluginecosystem.1)donationsfromusersererspromusersprovideThemainIncome,seepthetTheToolFreeAndFosteringCommunity.2)赞助商shipsorsshipshipshipshipshipsfromcompaniesofferostableferableforableforperablecomeincomeMaintainingInperceenterce.3)a a a a a a)

访问记事本:探索免费选项访问记事本:探索免费选项Apr 18, 2025 am 12:07 AM

Notepad 的免费替代品包括VisualStudioCode、SublimeText和Atom。 1.VisualStudioCode支持多种语言并通过扩展增强功能。 2.SublimeText提供评估版,速度快且界面简洁。 3.Atom以高度可定制性着称,适合个性化需求。

记事本:检查自由和开源性质记事本:检查自由和开源性质Apr 17, 2025 am 12:07 AM

Notepad 是免费且开源的文本编辑器。1)免费使用降低了进入门槛,2)开源特性通过GPLv2许可证实现,允许查看、修改和分发源码,促进社区参与和软件进化。

notepad  怎么使用notepad 怎么使用Apr 16, 2025 pm 08:09 PM

Notepad 是一款用于 Windows 的免费文本编辑器,它提供多种功能,例如:1)语法高亮显示,2)自动完成,3)宏录制,4)插件扩展,5)可定制的界面和设置。

notepad怎么自动排版notepad怎么自动排版Apr 16, 2025 pm 08:06 PM

Notepad 本身不具备自动排版功能。我们可以使用第三方文本编辑器,如 Sublime Text,执行以下步骤实现自动排版:1. 安装并打开文本编辑器。2. 打开需要自动排版的文件。3. 查找并选择自动排版功能。4. 编辑器将自动排版文本。5. 可根据需要自定义排版规则。自动排版可以节省时间,保证文本一致性和专业性。

notepad怎么对比两个文档异同notepad怎么对比两个文档异同Apr 16, 2025 pm 08:03 PM

要使用记事本对比两个文档的异同,请按照以下步骤操作:在记事本中同时打开两个文档。将文档并排查看。逐行对比文本,找出差异。用颜色突出显示或下划线标记差异。记录发现的差异以供将来参考。

notepad中文怎么设置notepad中文怎么设置Apr 16, 2025 pm 08:00 PM

要将 Notepad 设置为中文界面,请执行以下步骤:1. 打开 Notepad;2. 选择 "格式" > "字体";3. 选择 "中文(简体)" 或 "中文(繁体)";4. 单击 "确定"。

notepad  怎么格式化代码notepad 怎么格式化代码Apr 16, 2025 pm 07:57 PM

使用 Notepad 格式化代码的方法如下:打开代码文件选择代码转到“编辑”菜单选择“格式化”选项根据需要自定义设置(可选)

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。