搜索
首页开发工具notepad关于Windows Notepad里可选的字符编码

关于Windows Notepad里可选的字符编码

Feb 18, 2021 pm 05:37 PM
unicodewindows记事本

下面由notepad教程栏目给大家介绍关于Windows Notepad里可选的字符编码,希望对需要的朋友有所帮助!

关于Windows Notepad里可选的字符编码

简析Windows Notepad里可选的字符编码

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

2d2ff06a882f517ffe6eb38c61d4dd6.png

▲ 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-16UCS-2
[注D] Unicode的最大值实际上达到了U+10FFFF,超出了两个字节能够存储的限度。
 但Unicode由于历史原因,留下了U+D800~U+DFFF这一段永久保留不用的空缺区域。
 因此对U+10000及以上的字符,UTF-16借助了这部分空缺区域,对这些编码超大的字符打破2字节16位的惯例,特别的用4字节32位去表示之。
 这一部分编码值太大的字符,超出了GBK的字符集范围,因此本文将完全忽略。如有机会再进一步测试。

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

声明
本文转载于:segmentfault。如有侵权,请联系admin@php.cn删除
安装记事本:逐步指南安装记事本:逐步指南Apr 25, 2025 am 12:08 AM

记事本ISAPADER FULE,CUSTORIZABLETEXTEDOTORIDEALFORCODERSAND WRITERS,offeringFeaturesLikesyNtaxHighighlightingingIngingingIngingIngingIngingingingAndPluginSupport.toInstall:1)下载FromTheOfficialWebsite,2)RuntheInstaller,选择yourlangandInStallageAndInstallationOptions,3)customizepost-customizizepost

记事本的成本:您需要知道什么记事本的成本:您需要知道什么Apr 24, 2025 am 12:06 AM

Notepad 的使用伴随着时间、学习曲线和生产力损失的隐性成本,但可以通过利用插件、定制工作流程和结合其他工具来最大化其优势。使用Notepad 可能需要更多时间手动完成任务,学习其插件系统和定制功能需要时间,简洁性可能导致生产力损失,但通过安装插件如NppFTP、定制快捷键和界面、结合使用GitBash和VisualStudioCode,可以有效提升开发效率。

记事本:免费下载和使用?记事本:免费下载和使用?Apr 23, 2025 am 12:05 AM

Notepad 是完全免费且开源的。1.它基于Windows,由DonHo开发,支持多种编程语言。2.提供语法高亮、代码折叠等功能,轻量且资源消耗低。3.通过宏和插件如NppExec,可以自动化任务和执行外部命令。4.建议定期更新,探索社区资源,并根据需求考虑其他编辑器。

记事本安装过程:详细说明记事本安装过程:详细说明Apr 22, 2025 am 12:03 AM

Notepad 的安装步骤:1.访问官方网站下载最新稳定版本;2.运行安装文件,点击“Next”;3.同意许可协议;4.选择安装路径;5.选择是否创建桌面快捷方式和开始菜单文件夹;6.完成安装并启动Notepad 。

记事本:探索定价和许可记事本:探索定价和许可Apr 21, 2025 am 12:12 AM

Notepad 是免费且开源的,采用GPLv2许可证。1.任何人都可以免费使用和修改Notepad 。2.企业使用时,任何修改或扩展必须以GPLv2发布。3.商业产品使用需遵循GPLv2,包括公开源代码。

记事本:编辑背后的国家记事本:编辑背后的国家Apr 20, 2025 am 12:08 AM

Notepad由Fromfrance,Createbydonho.1)法国的sfocusoneDucation andTechnologyFostersInnovation,ReflectedInnotePad's sdesign.2)Theopen-sourceethoseethoseethoseeThosalignswithfrenswithfrenchventhithventhruesofsharingledge.3)

记事本:了解财务模型记事本:了解财务模型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以高度可定制性着称,适合个性化需求。

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脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

mPDF

mPDF

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

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境