加密编辑器记事本替换






4.85/5 (49投票s)
一个 C# .NET 3.5 (Win7) Windows 窗体应用程序,包含源代码
CryptPad 版本 2015.6.5
目录
- 发布历史
- 引言
- ASCII, ANSI, UTF-8
- 安装程序
- 使用程序
- Using the Code
- 关注点
- 记事本是什么?
- 文本框鼠标/键盘操作
- CryptPad 键盘快捷键
- 主菜单功能
- 命令行自动化
发布历史
CryptPad 程序最新更改历史记录和发行说明。
- 发布版本 2015.6.5
- 修复了保存空文件时无法保存的问题。
- 修改了正则表达式处理。
- 将旧的 DateTimeISO 类修改为新的 ISO8601 类,并进行了一些改进的命名更改。
- 发布版本 2015.4.12
- 读取没有 BOM(字节顺序标记)的 Unicode 文件。
- 完全修改了文件的解码和编码。
- 添加了一个二进制伪编码以进行十六进制显示。
- 在打开文件时,关于意外文件内容的提示信息中添加了索引引用。
- 一个 proper 的纯文本文件始终以 CR/LF 或仅 LF 结尾。CryptPad 现在强制执行此规则。
- 将项目转换为 Visual Studio 2013 Express for the Desktop。
- 发布版本 2015.3.22
- 放弃了版本号的方案,直接使用发布日期作为版本号。
- 调整了在程序中使用 SystemFonts.MessageBoxFont 的方式。
- 对 REG 文件进行了少量修订,以遵循 Microsoft 指南。由于 Microsoft 的版本和更新更改,我仍然无法可靠地更改 HTML 文件的编辑器。这需要在 IE 中进行更改。
- 发布版本 3.2 2015-01-11
- 将旧的 AbbreviateApproximate 类修改为新的 SI 类,并进行了一些改进和更改。
- 使用了用户在 Windows 外观控制面板中选择的消息框样式。
- 对 TextBox 进行了少量效率改进,以避免不必要的复制。这在编辑大文件时特别有用。
- 稍微调整了消息框的宽度,以避免在极端情况下换行。
- 发布版本 3.1 2014-10-05
- 添加了 CryptPadAddXP.REG 文件,适用于那些还在使用旧电脑的用户。
- 尝试调整针对更新后观察到的 HTML 编辑的某些注册表更改。暂时,只有 IE 可以更改默认编辑器。
- 我仍在继续使用、测试和改进正则表达式的实现和文档。发现了一个问题,即错误或不完整的正则表达式模式没有给出任何错误指示。
- 在之前使用过正则表达式后,输入查找或替换会导致异常。
- 复制或粘贴包含正则表达式的查找或替换字符串时发生损坏。
- 发布版本 3.0 2014-07-27
- 修正了帮助、在线内容和帮助、关于描述中“CryptPad”的链接大小写错误(应该是“CryptPad”而不是“Cryptpad”)。
- 修正了一个错误以及当前目录处理方面的一些遗留问题。
- 简化了一些设置代码和其他少量代码更改。
- 在消息框类中添加了 AcceptButton 和 CancelButton,这样即使焦点在文本框上,您仍然可以使用 Enter 键或 ESC 键。
- 在查找和替换对话框中添加了一个组合框,用于提醒和自动插入特殊的非正则表达式模式以及一些最常见的正则表达式模式。随着正则表达式的引入、开发和测试,版本号提升至 3.0 版本。
引言
我曾经非常喜欢 Windows 记事本!我曾用记事本写过所有的 HTML、Jscript、CMD 脚本,还有更多。它是我的首选文本文件编辑工具,用于一般的软件开发目的。它速度快且简单。那么,为什么我还要编写一个替代程序呢?
CryptPad 程序的主要目的是提供可选的文本文件加密。这对于包含敏感信息的文本文件很有价值。与其他许多加密解决方案不同,它无需安装,非常简单,并且对操作系统没有侵扰性。CryptPad 只在保存和打开时加密和解密一个文本文件。除非操作员指定移除加密,否则永远不会存储文本文件的解密版本。文本文件可以存储在多个地方,并像任何其他文本文件一样自由移动,但始终以加密形式。任何知道加密字符串的人都可以使用此程序读取文本文件。
您可以参考 加密 部分获取更多详细信息。
为了更好的安全性,在您访问的每个网站上使用不同的密码非常重要。为了维护这些多个密码,我有一个包含我使用的所有密码的文本文件。这也有安全风险,除非文本文件被加密。我检查了许多加密解决方案,但没有一个能完全满足我的需求。我需要能够传输和存储一个加密的文本文件到任何我想要的地方。加密驱动器不是我需要的。文本文件绝不能以解密形式存在。因此,我需要一个简单的编辑器,可以打开、解密、编辑、加密和保存文本文件。
我还希望加密的文本保持为明文而不是二进制,这样操作员就可以在任何可以使用明文的地方(例如通过复制粘贴)使用加密文本。我还希望数据的尺寸保持在实际可行的最小范围。因此,二进制加密的特殊编码不能满足我的目的。
您可能会注意到我使用了“操作员”一词。我对“用户”这个词感到有些不舒服。我深受计算机行业的影响,自 1971 年左右开始,拥有超过 40 年的计算机工作经验。我记得那些自以为是的无知者称呼“luser”(失败者),认为他们的地位高于普通的计算机用户。另外,“drug user”这个短语也有不幸的关联。敏感性可能不被认为是“男子气概”的特征,但我珍视并实践这一特质。我评估词语的使用,就像我评估我使用的和编写的计算机软件一样认真。
请注意,我一点也没有将 CryptPad 描述为记事本的克隆。克隆是精确的复制品。记事本具有一些非常特定的功能,我还没有见过任何简单的记事本克隆完全复制。例如,记事本的撤销功能在大多数声称的“克隆”中都没有正确实现。在 CryptPad 中,只要可行,就实现了撤销功能。我也没见过简单的“克隆”能够像记事本和 CryptPad 那样正确地实现 UTF-8 和 Unicode 转换,或者读取带有 ANSI 字符的文本文件。主要的记事本替代程序,如 Notepad++,支持这些字符编码。
CryptPad 旨在与 Windows 7 记事本几乎相同。我选择不包含打印功能。我几乎从不使用纸张或打印!那些我可能需要打印的罕见场合,我只需使用记事本。CryptPad 不是“克隆”,但足够接近,可以作为有用的替代品。现在我创建了一个记事本替代程序的源代码,我一直在添加我日常编辑和通用软件开发工作中实用的功能。
我对记事本还有一个主要问题,因为它允许一种称为并行(或并发、或同时)更新的问题。在并行更新中,您已经打开了一个带有编辑的文本文件,但当您切换窗口时,它会退居后台。之后,您会再次打开该文本文件,却忘记了您已经打开了它。您进行新的编辑并关闭该文本文件。稍后,您切换到旧窗口,却忘记了(这是因为我编程超过四十年了吗?)您在一个新窗口中对其进行了更改并再次保存。您之前的编辑将丢失!有几种事件序列可能导致数据丢失。如果您编辑网络共享上的文本文件,并且其他人编辑同一个文本文件,情况会更糟!
与记事本不同,CryptPad 维护文本文件处于打开状态,锁定以防止并行更改,但与文本文件读取器共享。这可以保护文本文件免遭意外的并行修改数据丢失问题。我偶尔会在记事本上遇到这种情况。您仍然可以丢失更改,但这需要通过有意的操作序列来实现,而不是随意发生的意外。CryptPad 在需要时会以只读模式打开,但它不允许更改和保存文本文件。
警告! 我发现,在极少数情况下,某些网络连接可能无法长时间保持文本文件的打开/锁定状态。我对此问题尚不清楚。这似乎发生在同时支持 Web 服务的旧文件服务器上。当您尝试保存并失败时,您需要使用“另存为”来保存文本文件。您不受并行更新问题的保护。
CryptPad 包含许多记事本以外的小改进和特殊工具,对编辑很有用。其他最重要的添加功能是可选使用 .NET Framework 正则表达式语法进行查找和替换。
我希望您觉得 CryptPad 程序有用。我对您在程序中发现的任何问题,特别是作为记事本替代品的任何不兼容性感兴趣。我打算将程序保持尽可能小和简单。CryptPad 始终会是一把瑞士军刀,而不是一把瑞士军刀。
我将继续使用、修改和测试 CryptPad 程序。我将定期(大约每两个月一次)返回来更新本文档和源代码,包含最新的修复、改进和调整。
ASCII, ANSI, UTF-8
当您阅读有关此程序的信息时,您可能想问我一个问题。这些 UTF-8 和 Unicode 的胡说八道到底是怎么回事!?
在微型计算机的早期(约 1980 年),情况很简单。(实际上并不简单。还记得 EBCDIC 吗?但我们会假装它很简单。)所有文本文件都是 7 位 ASCII(美国信息交换标准代码)字符。请注意 ASCII 中的“美国”一词。世界上有许多人,使用不同的语言和字符,他们需要在日常计算机使用中得到表示。此外,普通 ASCII 之外还有许多其他常用的“美国”字符。
关于字符编码的主题存在很多困惑。如果您是一个注重细节的人,并且准备好进行深度阅读,您可以从这里开始
http://en.wikipedia.org/wiki/UTF-8
我将尽量简短而简单。当您使用典型的 ASCII 字符时,严格的 UTF-8(没有 BOM)与 ASCII 完全相同。您的大部分编辑将是简单的 ASCII。此网页几乎全是 ASCII。在大多数情况下,您可以到此为止。
您可能注意到我悄悄地插入了 BOM(字节顺序标记)这个缩写,并假设您知道它是什么。如果您是一个注重细节的人,并且准备好进行深度阅读
http://en.wikipedia.org/wiki/Byte_order_mark
简单来说,BOM 是文本文件开头的 2-3 个唯一字节,指示 Unicode 文本文件的编码方式。并非所有 Unicode 文本文件都有 BOM。
简单的 ASCII 的例外情况是非英语语言,以及您何时使用 Microsoft Word 的智能引号和撇号等字符。这些是简单“直”引号和撇号的“弯曲”排版对应物。撇号有一个弯曲,并且开始和结束引号有一个不同的弯曲。还有许多其他类型的特殊字符。许多其他语言也需要特殊字符。
有两种主要方式来表示这些非 ASCII 字符。旧的方式是使用单字节 8 位字符。这就是您看到“Windows-1252”或其他非 Unicode 字符编码时的情况。这些字符编码可能非常复杂且受限。记事本将其称为“ANSI”字符编码。Unicode 使支持所有人的字符的过程更简单(但不简单)。UTF-8 的发明是为了支持 ASCII 而不作任何更改,并通过 8 位字符的对或簇来选择性地扩展到 Unicode 字符。
如果这个简短的解释让您好奇想了解更多,那么您就可以回到我之前提到的深度阅读了。您还可以参考 字符编码 部分获取更多详细信息。
安装程序
此编辑器的重要功能是它不需要盲目安装程序或管理员权限。我使用“盲目”一词来指代典型安装程序所做更改的程度对您完全隐藏。我不喜欢隐藏的东西。有警惕性的黑客会明白我的意思。
CryptPad 程序完全独立,因此只需简单的复制即可永久“安装”和使用该程序。您可以将其保存在 U 盘上,并在任何运行 Windows 7 或更高版本的系统上使用。您可以在任何地方临时使用它,无需安装、无需权限,并且可以直接从 U 盘立即使用,没有任何问题。
这时我应该提到,CryptPad 程序使用标准的 .NET 持久化设置。持久化设置包括自动换行、字体、状态视图和窗口位置等。这些设置存储在一个名为 user.config 的文本文件中,该文件保存在一个名称类似于“%LOCALAPPDATA% (C:\Users\%USERNAME%\AppData\Local) \Frank_T_Clark_Software\CryptPad.exe_Url_*\”的目录中。这些设置保存在一个单独的唯一目录(“CryptPad.exe_Url_*”)中,该目录由 Windows 根据 CryptPad 版本和程序运行的位置生成。
推荐的 CryptPad 程序永久“安装”位置是在单个操作员的“文档”目录下的 CryptPad 目录中。这将是一个名为“%USERPROFILE% (C:\Users\%USERNAME%) \Documents\CryptPad”的目录。只需创建目录并将程序复制到该位置即可。您可以将 CryptPad.ZIP 文件下载到“文档”文件夹,然后解压缩到此目录。下载提供了一个文档/帮助 HTML 文件、一个图像文件以及有用的脚本,也可以放置在此目录中。帮助 HTML 文件也可在线获取,并且可能包含其他更新信息。
如果您愿意,可以将“打开方式”设置为默认使用 CryptPad 来打开 CryptPad 创建的 .SAFE 加密文本文件。您也可以选择将 .TXT 设置为默认的“打开方式”为 CryptPad,以利用额外的编辑功能。
我不提供盲目安装程序,因为我希望您绝对确切地知道使用该程序需要什么。卸载非常简单。删除程序!大多数安装程序都会神秘地对您的计算机进行未知更改。我甚至不会盲目为您更改注册表。我确实提供了一个可读的 CryptPadInstall.CMD 脚本和一个 CryptPadAdd.REG 文件,它们说明了您可以使用的安装过程。
CryptPadInstall.CMD 脚本使用的 CryptPadAdd.REG 文件包含我用来将 CryptPad 设置为默认编辑器的所有设置。这些设置已在 Windows 7 上使用和测试。我现在使用 CryptPad 来编辑我曾经使用记事本编辑的所有内容。我使用“Default Programs Editor”免费下载记录了注册表更改,它效果很好。强烈推荐。
CryptPadAdd.REG 文件包含注册表项,用于将 CryptPad 程序关联为 .SAFE 和 .TXT 文件类型的默认编辑器。.HTML、.CMD 和 .REG 文件类型具有上下文菜单(右键单击)的“编辑”选项。所有这些文件类型还具有上下文菜单选项“打开(只读)”。有一个 CryptPadDelete.REG 文件,其中包含这些注册表项的删除代码。CryptPadInstall.CMD 文件会自动将 CryptPad 程序复制到默认的“安装”位置并运行 Regedit。安装 CMD 脚本也可以从“安装”目录运行,只添加注册表项。
我在将 CryptPad 自动关联到 HTML 的注册表选项方面遇到了一些麻烦。它会随着 Windows 和 IE 的不同版本和更新而变化。正确设置它很棘手。通常您需要直接在 IE Internet 选项、程序、HTML 编辑、HTML 编辑器或当前方法中进行更改。
“Program Files”目录可以用于为所有操作员进行管理员安装。提供的“安装”脚本支持这一点。当程序安装在“Program Files”目录中时,在安全的环境中,它不需要特殊权限即可正常使用。在程序正常运行期间,绝不会尝试写入程序安装目录。CryptPadInstallAdmin.CMD、CryptPadAddAdmin.REG 和 CryptPadDeleteAdmin.REG 文件支持管理员安装和修改所有操作员的注册表。
管理员安装选项未经充分测试,因为我很少使用管理员权限。我无法在 Windows Server 2008 上运行安装脚本,但我没有怎么尝试。手动安装非常简单。只需复制文件并单击 CryptPadAddAdmin.REG。即使在我自己的个人电脑上,我也很少使用管理员权限。个人操作员安装已在我工作场所和家中得到大量使用和测试。
我提供完整的源代码,以便您确切地了解 CryptPad 程序的功能。如果您愿意,可以自己编译。检查代码并不容易,除非您已经是 C# 程序员,但如果您关心的话,它还是可用的。通过这些方法,您可以信任该软件。市面上有很多不可信的东西。您不必信任我。完全披露是最好的信任。
CryptPad 程序是一个 C# Windows 窗体应用程序,使用 Visual Studio 2013 Express for the Desktop 编译,.NET Framework 版本为 3.5,该版本已包含在 Windows 7 操作系统中。程序只需要提供的源代码和标准的 Windows 功能以及 VS2013。没有使用第三方库。不需要或使用单独的 DLL。该程序已在 Windows 7 操作系统上得到充分使用和彻底测试。
CryptPad 程序在 Windows 8 操作系统上仅使用了一点点(真糟糕!)。Windows 8.1 也没好到哪里去……也许 Windows 10?
CryptPad 程序未在 Windows Vista(又一个真糟糕!)或 XP 上使用或测试过。不幸的是,.NET Framework 3.5 未安装在 Windows Vista 或 XP 中,因此您需要安装它才能在 Windows Vista 或 XP 中使用该程序。这些操作系统上可能存在程序问题。我通常不再使用 Windows Vista 或 XP,因此我无法帮助您。
但是,我确实遇到了一个需求,当时我正在使用一个仍在使用 Windows XP 的旧自动化服务器。您敢相信其中一些旧服务器仍在运行 Windows 2000 吗!?这很可悲,但有时您无法轻易替换或更新这些仍在运行的旧计算机。因此,我为那些还在使用旧电脑的人添加了 CryptPadAddXP.REG。不同之处在于 Windows XP 上的“Documents”目录名为“My Documents”。正是这些小小的改变导致了主要的麻烦。
使用程序
也许描述创建加密文本文件的分步过程对您有所帮助。
- 启动 CryptPad 程序。
- 选择 文件,加密
- 输入您的加密字符串,然后按 Enter 键。
- 再次输入相同的加密字符串,然后按 Enter 键。
- 输入您的数据。
- 保存您的文本文件。
- 如果您在记事本中打开加密的文本文件,您将看到“~!@#”以及更多无意义的字符。关闭文本文件而不进行任何更改。
- 在 CryptPad 中打开加密的文本文件。
- 输入您的加密字符串,然后按 Enter 键。
- 您的数据就在这里……
您还可以为现有文本文件添加 CryptPad 加密。
- 使用 CryptPad 程序打开任何文本文件。
- 选择 文件,加密
- 输入您的加密字符串,然后按 Enter 键。
- 再次输入相同的加密字符串,然后按 Enter 键。
- 保存您的文本文件。
从现有加密文本文件中移除 CryptPad 加密也很简单。
- 使用 CryptPad 程序打开任何加密的文本文件。
- 输入您的加密字符串,然后按 Enter 键。
- 选择 文件,加密
- 输入一个空字符串
- 输入第二个空字符串
- 保存您的文本文件。
CryptPad 程序的安装和使用不适用于随意或新手操作员!如果您仔细遵循说明,您将能够安装和使用该程序。CryptPad 程序的使用与记事本一样简单。最小的复制安装非常简单。“打开方式”的使用也不难。
可读的 CryptPadInstall.CMD 和 CryptPadAdd.REG 文件也可用于 CryptPad 程序的完整“安装”。这些文件已在 Windows 7 操作系统上进行了仔细测试。
警告! CryptPadInstall.CMD 和 CryptPadAdd.REG 文件的可选使用需要高水平的知识和复杂的技能才能理解它们所做的更改。使用 .REG 文件可能会对 Windows 操作系统的功能造成严重损害,这就像使用注册表编辑器一样。您之前看到的所有关于使用注册表编辑器的危险警告都适用于使用 .REG 文件。通常情况下,使用由知识渊博的开发人员创建的预写 .REG 文件是安全的。当您仔细遵循由知识渊博的开发人员创建的使用注册表编辑器的说明时,通常也是安全的。
欢迎您前往 Code Project (www.codeproject.com) 论坛,CryptPad 程序也在此发布,留下 评论。需要注册。Code Project 是数百万软件开发人员的互联网聚集地。
Using the Code
我提供完整的 VS2013 C# 项目 zip 文件,包含 CryptPad(加密编辑器记事本替代程序)的可执行文件、文档和完整的源代码,供喜欢软件代码的用户使用。您可能对添加自己的特殊功能感兴趣。
我希望您觉得源代码具有启发性,能够从中获得一些想法。我通过研究他人的代码学到了很多。我希望研究我的代码对您有所帮助。
项目目录包含许多测试文件以及我发现用于开发、测试和使用 CryptPad 的各种有用内容。特别值得关注的是“CryptPad(只读)”和“SendTo”快捷方式。单击“SendTo”快捷方式会打开这些快捷方式所在的目录。您可以将“CryptPad(只读)”快捷方式拖放到“SendTo”快捷方式上来添加新项。使用“SendTo”目录可以做许多有趣且有用的事情。
特别值得一提的是 CryptPadAdd.REG 文件。此文件包含注册表项,用于为 Windows Explorer 提供上下文菜单、“打开方式”等类型关联,以使用 CryptPad 处理各种文件扩展名。如果您不使用推荐的“Documents\CryptPad”目录,则必须编辑 CryptPad.REG 文件以提供 CryptPad.exe 文件所在的位置。CryptPadAdd.REG 文件提供的一些条目无法仅通过“打开方式”关联功能来复制。
警告! 使用 .REG 文件需要高水平的知识和精密度。使用 .REG 文件可能会对 Windows 操作系统的功能造成严重损害,这就像使用注册表编辑器一样。您之前看到的所有关于使用注册表编辑器的警告都适用于使用 .REG 文件。
关注点
我的代码中有几处地方与其他代码略有不同或不寻常。我将描述其中一些有趣的方面以及我使用它们的原因。我从典型的 VS2013 项目中进行了几项不同寻常的应用程序更改。我将应用程序主入口点的代码嵌入到了主窗体中,而不是使用单独的文件。对我来说,去掉额外的文件是一个不错的选择。
自动字符编码识别
CryptPad 程序源代码中众多有趣的功能之一是自动检测 ANSI、UTF-8 和 Unicode 字符编码以及字节顺序标记(BOM)。这是我看到过的简单记事本“克隆”中缺少的功能。.NET 库提供了自动检测所需的所有支持,但没有告诉您如何使用它。
自动检测需要两个信息和一些示例代码来演示其用法。我见过许多复杂的自动检测解决方案,但它实际上非常简单。我将提到我的假设是文本文件已正确编码,没有字符编码错误或格式错误的字符。对于任何用于创建文本文件的正确编写的程序(如记事本和 CryptPad)来说,这是一个合理的假设。
CryptPad 程序提供了对没有 BOM 的 Unicode 文本文件的有限检测。CryptPad 程序专为行以 CR/LF 或仅 LF 结尾的文本文件设计。这种期望为简单的 Unicode 识别方法提供了机会。这仅在文件以 CR/LF 或仅 LF 结尾时成功。
由于我在开发环境中使用此软件,因此经常可能意外地将二进制字符写入文本文件。也有可能意外打开实际的二进制文件。CryptPad 程序将其处理为十六进制显示,并限制为只读。
CryptPad 程序的设计要求是避免任何非标准 DLL 要求,避免 Platform Invoke (P/Invoke) 功能,尽可能简单,并大量依赖现有的标准 C# .NET 功能。
我使用文本文件末尾的 LF 来自动检测 Unicode LE 或 BE(无 BOM)。任何正常的文本文件都会以 LF 字符结尾。如果一个没有 BOM 的 Unicode 文本文件不以 LF 结尾,那么您将需要在“打开”或使用“重新打开解码”时手动指定字符编码。
这些是可能的字符编码
- 二进制文件
- 这是通过存在未被识别为 Unicode 的 NUL 字节来推断的。CryptPad 程序提供十六进制显示,并限制为只读。
- 旧式 ANSI 文本文件(用于不同的代码页)
- CryptPad 程序不直接支持此功能。
- 旧式 ANSI 文本文件(假定为当前代码页)
- 这可以通过排除其他可能性来高精度地确定。CryptPad 程序检查 Unicode 非 BOM,由文本文件末尾的 Unicode LF 字节的存在确定。
- 典型 UTF-8(ASCII)
- 由于该编码的独特特性,这可以高精度地确定。CryptPad 程序检查 ASCII Unicode 非 BOM,由文本文件末尾的 Unicode LF 字节的存在确定。
- 带 BOM 的 UTF-8
- 这可以高精度地确定。
- Unicode LE(无 BOM)
- 这是由文本文件末尾的 Unicode LF 字节的存在确定的。
- Unicode LE(带 BOM)
- 这可以高精度地确定。
- Unicode GE(无 BOM)
- 这是由文本文件末尾的 Unicode LF 字节的存在确定的。
- Unicode GE(带 BOM)
- 这可以高精度地确定。
一般程序
- 尝试编码为 UTF-8(ASCII 非 BOM)和 Unicode 字节顺序标记,但例外情况是可能的 ANSI。
- 如果是 UTF-8(ASCII 非 BOM),则测试文本文件末尾是否存在 Unicode LF 字节。
- 如果是可能的 ANSI,则测试文本文件末尾是否存在 Unicode LF 字节。
第一个必要信息是认识到 UTF-8 字符编码已精心设计为可自动检测,这使其与 ANSI 字符编码的复杂性和模糊性大不相同。ANSI 文本文件被误认为 UTF-8 的可能性极小(但并非不可能)。其他检测方法也无法提供更好的保证。我不会详细介绍 UTF-8 字符编码的这一特性。
第二个必要信息是认识到 .NET 库通过处理 ANSI 字符时出现的异常来实现自动检测。不幸的是,文档没有将这些连接起来,说明如何实现这种自动检测。
此示例代码演示了 UTF-8 和其他 Unicode 字符编码的自动检测,并带有回退到 ANSI 字符编码的异常处理。
这个简单的(假设您是一位熟练的 C# 程序员)示例摘录与提供的源代码并不完全相同。
file_stream = new FileStream (filename, FileMode.Open,
FileAccess.ReadWrite, FileShare.Read);
// UTF-8 encoding with automatic detection of other
// Unicode encodings and ANSI error detection
Encoding save_encoding = new UTF8Encoding (false,true);
StreamReader sr = new StreamReader (file_stream,
save_encoding, true);
string str = null;
try
{
str = sr.ReadToEnd ();
// Save the actual encoding for later write
save_encoding = sr.CurrentEncoding;
}
catch
{
// ANSI error detection
save_encoding = null;
}
if (null == save_encoding)
{
// use ANSI from the default code page
save_encoding = Encoding.GetEncoding (0);
file_stream.Position = 0;
sr = new StreamReader (file_stream,
save_encoding);
str = sr.ReadToEnd ();
}
... modify str
// discard any previous contents
file_stream.SetLength (0);
// use StreamWriter with the same encoding
StreamWriter sw = new StreamWriter (file_stream,
save_encoding);
sw.Write (str);
简单加密算法
CryptPad 程序源代码中最独特的部分是加密。该程序使用一种快速简单的双重搅乱算法,该算法基于操作员提供的秘密加密字符串进行加法/减法运算。程序仅加密 ASCII,以便 CryptPad 程序具有连续的算术范围。我的歉意是那些语言非 ASCII 的用户。目的是继续使用文本而不是二进制处理。加密效率很高,只会增加 21 字节的大小。
可以使用 Base64 或类似编码将整个 Unicode 字符串转换为 ASCII 以进行加密。这将增加大量的处理开销和文件大小。使用任何标准加密都会产生相同的效果。这些其他方法也会增加程序的复杂性。这种快速、简单且有效的解决方案最符合我的需求。
这些简单的示例摘录与提供的源代码并不完全相同。
private string Encrypt (string str)
{
StringBuilder st = new StringBuilder (str);
for (int i = 0; i < st.Length; ++i)
{
int chr = st[i];
if (isASCII ((char) chr))
{
chr = ' ' + (((chr - ' ') + E (i)) % 95);
st[i] = (char) chr;
}
}
return st.ToString ();
}
private string Decrypt (string str)
{
StringBuilder st = new StringBuilder (str);
for (int i = 0; i < st.Length; ++i)
{
int chr = st[i];
if (isASCII ((char) chr))
{
chr = ' ' + ((chr - ' ') - E (i) + 95) % 95;
st[i] = (char) chr;
}
}
return st.ToString ();
}
加密字符串使用基于加密字符串校验和的伪随机数进行搅乱。
private int E (int i)
{
return (encryption_string[i % encryption_string.Length]
+ i + i * random_seed) % 95;
}
// plus checksum for random_seed
private int ChecksumAdd (string str)
{
int checksum = 0;
for (int i = 0; i < str.Length; ++i)
{
checksum += str[i];
}
return checksum;
}
CryptPad 程序在文本文件中使用了额外的 XOR 校验和,以便在尝试解密时验证加密字符串是否正确。CryptPad 程序保护短加密字符串,将其扩展到至少 32 个字符。目的是保护操作员免受错误的解密,并在他们输入错误的加密字符串时发出警告。
// xor checksum for in the file
private uint ChecksumXOR (string str)
{
uint checksum = 0;
int j = 32;
if (32 < str.Length)
j = str.Length;
for (int i = 0; i < j; ++i)
{
uint t = 0;
if (0 < (0x80000000 & checksum))
t = 1;
checksum <<= 1;
checksum |= t;
checksum ^= str[i % str.Length];
}
return checksum;
}
CryptPad 程序使用第二个 XOR 校验和来检测加密数据是否在未解密的情况下被修改而损坏。这将破坏加密数据的完整性。操作员在尝试打开文本文件时会立即收到通知,告知加密数据是否已被修改和损坏。如果“~!@#$”加密头被修改,则假设数据未加密并显示,无需解密。
我不会声称 CryptPad 程序使用的加密是 CIA 级别的,但我认为它非常有效。加密的强度在很大程度上取决于加密字符串的长度。一个长度为十个或更多字符的强字符串,除非是熟练的密码学家,否则不太可能被破解。我不是一个熟练的密码学家,但我熟悉密码学的一些方面。针对此加密的主要攻击已经被预料到。
我提出一个挑战,看看是否有聪明的黑客或熟练的密码学家会感兴趣并破解我的加密。我在 zip 文件中包含了一个名为“hack.safe”的文本文件。如果您能破解我的加密,请在讨论区发布结果以及加密字符串。任何人都可以验证您的成功。我很想知道您是如何做到的,花了多长时间,以及需要什么样的设备。
最可能的攻击将针对用于验证加密字符串是否存在拼写错误的 XOR 校验和。这种攻击的成功取决于您选择的加密字符串的强度。
有人建议 CryptPad 程序应该使用 File.Encrypt 方法。我不想让文本文件的解密版本在任何驱动器上存在任何时间。我希望能够将文本文件带到任何地方并随时使用。CryptPad.exe 可以与加密的文本文件一起携带(例如在 U 盘上),并可在任何地方使用,无需安装或卸载即可读取文本文件,并且计算机上永远不会留下解密文本文件的痕迹(好吧,可能在内存或页面文件中……)。我希望加密是文本,我可以将其复制粘贴到任何地方。File.Encrypt 方法不满足上述任何标准。我还没有看到任何满足这些标准的方法。
也有人建议 CryptPad 程序应该使用行业标准的加密方法。这将导致二进制文件。我想只使用产生明文的方法,这样加密就可以粘贴到电子邮件、即时消息以及通常使用明文的地方。可以对结果进行 Base64 编码。我不希望文件大小显著增加。标准加密方法还会增加程序的复杂性和处理量。
那些希望使用行业标准加密方法并支持 Unicode 的人可以根据自己的需求修改程序。我对简单快速的 ASCII 加密过程感到满意。
替换消息框
CryptPad 程序包含了我自己版本的简单部分替换,类似于标准的 MessageBox。我检查了许多其他标准的 MessageBox 替换,发现它们对我简单的目的来说太复杂了。这些是我的要求
- MessageBox 对话框必须居中于 CryptPad 窗口,而不是居中于屏幕。
- 允许将消息文本复制到剪贴板并粘贴到文本文件中,以便在问题报告或其他用途中共享。
- 将光标捕捉到默认按钮。
- 该类是一个单一文件,可通用地放入任何应用程序。
- 保持简单!
Messagebox.cs 文件是三个文件的组合,它们首先使用设计器分别开发和测试,然后合并。
旧式主菜单
使我的代码有些不寻常的地方之一是使用了旧式的 System.Windows.Forms.MainMenu 控件,而不是 System.Windows.Forms.MenuStrip 控件(记事本也使用它)。我更喜欢旧控件的简单视图和布局。这不在标准的 VS2013 工具箱中,但可以轻松添加到项目中,并且仍然得到 Form Designer 的支持。
在 CryptPad 项目中,我向 CryptPad.Designer.cs 文件添加了以下行以开始使用 MainMenu 控件。
在 InitializeComponent 函数的开头之后
private void InitializeComponent ()
{
我添加了
this.mainMenu = new System.Windows.Forms.MainMenu ();
this.Menu = this.mainMenu;
在文件末尾,之后
#endregion
我添加了
private System.Windows.Forms.MainMenu mainMenu;
单击“CryptPad.cs [Design]”选项卡中的 mainMenu 图标,然后开始输入菜单项。有时您必须关闭选项卡并重新打开它们。
自动字体用户偏好
我的代码中另一个不寻常之处是自动调整所有对话框字体以匹配用户偏好。首先,我搜索并移除所有字体设置,以便使用默认值。这会导致对话框的任何字体更改自动向下传播到所有控件。在所有对话框的构造函数中,我在调用 InitializeComponent 函数后添加了以下行
InitializeComponent ()
我添加
this.Font = SystemFonts.MessageBoxFont;
在消息框字体中选择的任何内容都将自动用于对话框。同样重要的是确保您的应用程序中的以下值保持一致
this.AutoScaleDimensions = new System.Drawing.SizeF (6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
这些过程的另一个优点是,该应用程序对用户设置或监视器更改的 DPI 更改更加健壮。我的经验是,通过更改默认字体(控制面板\所有控制面板项\个性化\窗口颜色)而不是更改 DPI,通常更容易获得可读的显示。Windows 8 破坏了此选项。Windows 8.1 提供了有限的选项。我们将看看 Windows 10 会发生什么。
记事本是什么?
记事本是 Windows 操作系统提供的基本文本编辑工具,用于查看或编辑纯文本文件。文本文件是一种通常以 .TXT 文件扩展名标识的文件类型。还有其他包含文本的扩展名,我经常用记事本编辑。
除了是纯文本编辑器之外,记事本还有几个重要的特性需要注意。可能其次最重要的特性是整个文本文件在编辑时完全加载到内存中。这使得记事本对于典型的约 64k 或更小的文本文件速度很快。然而,当编辑多兆字节的文本文件时,这是一个问题。好消息是 Windows 7 记事本和 CryptPad 可以做到这一点,但坏消息是它的速度会很快变慢。您通常不需要经常这样做。
另一个重要的特性是它支持所有标准的文本文件字符编码。ANSI、UTF-8(ASCII)、Unicode(UTF-8)、Unicode 和 Unicode(Big-Endian),带或不带 BOM。
什么是 Windows Explorer?
理解记事本与 Windows Explorer 紧密集成非常重要。CryptPad 程序也可以与 Windows Explorer 紧密集成。Windows Explorer 是我通用的主要开发平台或环境。大多数开发人员都明白这一点。初级计算机操作员可能不理解 Windows Explorer(也称为“我的电脑”)的重要性。“桌面”实际上是 Windows Explorer 的一个简单视图。我主要将 Windows Explorer 用作我的启动平台。
在新计算机上,我总是做的第一件事是启用“我的电脑”图标在“桌面”上。我还总是将其重命名为计算机的名称,因为我经常远程到许多计算机,所以有一个小的提醒我正在使用哪台计算机很有帮助。很多时候,我在桌面上点击的第一件事就是“我的电脑”或 Windows Explorer。
我对 Windows Explorer 的配置非常讲究。显示所有文件信息至关重要。在新计算机上,我总是做的第二件事是在 Windows Explorer 中启用文件详细信息。第三件事是我将默认布局更改为显示导航窗格。我也喜欢详细信息窗格。
什么是纯文本?
所有文件都可以分为两大类。文本文件主要设计供人阅读。二进制文件主要设计供计算机程序读取。二进制文件可能包含文本,但文本文件几乎不包含二进制数据。
一个 proper 的纯文本文件仅包含供人阅读的打印字符。文本文件将包含 ASCII CR/LF 控制字符来指示行尾,并可能包含 ASCII HT(制表符)控制字符来将文本排列成列。任何其他 ASCII 控制字符都是不 proper 的。其中一些 ASCII 控制字符实际上已编码为可打印的 Unicode 字符。在典型的 Windows 文本文件中,ASCII CR 或 LF 控制字符不是 CR/LF 对的一部分也是不 proper 的。一个 proper 的纯文本文件始终以 CR/LF 或仅 LF 结尾。CryptPad 在保存文本文件时强制执行此规则。
什么是 TextBox?
记事本基于 Windows 文本框控件,该控件提供了大部分编辑功能。记事本和文本框的文档对其功能都有些不足,但大部分都很简单。记事本中的“帮助”选项除了提供一些关于记事本的常见简单问题的答案外,几乎没有其他作用。至少记事本的功能片段在菜单选项中列出了。关于功能如何执行,还有很多问题悬而未决。本文档为 CryptPad 对记事本功能的实现回答了这些问题。
TextBox 是 Windows 的主要输入控件。几乎所有其他 Windows 输入功能要么扩展要么模仿 TextBox 的基本功能。我在 CryptPad 的帮助和网站文档中提供了更多关于使用 TextBox 进行编辑的描述。
CryptPad 有何不同?
CryptPad 的基本用法与记事本基本相同。CryptPad 程序的设计类似于记事本。CryptPad 也基于 TextBox 控件。CryptPad 与记事本的主要区别在于缺乏对打印的支持。您可以在需要打印时使用记事本。CryptPad 添加了对加密、文件锁定、.NET Framework 正则表达式语法和自动备份的支持。CryptPad 提供了记事本以外的其他功能。
CryptPad 提供的功能比记事本更详细。文档假设您知道如何使用记事本,因此主要描述了与记事本的不同之处。文档还描述了它与记事本共享的一些更神秘的操作。典型的计算机精英(极客)喜欢晦涩的软件操作,需要进行研究才能发现然后记住。我相信文档,这在许多自认为是计算机使用和软件开发技能的人中是会被鄙视的。也许他们不会或不愿读 plain English,并认为其他人也不会。
CryptPad 在所有 CryptPad 对话框中使用操作员指定的对话框系统字体和大小。视力好且年轻的用户可以使用默认的 8pt 或其他任何字号,而视力不好且年长的用户可以使用“控制面板”、“个性化”、“窗口颜色和外观”来指定所需的字号。我偏爱 Verdana 12pt。这在 Windows 7 上运行良好,但 Microsoft 以其卓越的智慧,似乎不允许我们在 Windows 8 上指定自己的字体!在 Windows 8 上更改字体大小也很尴尬,就像 Windows 8 的很多方面一样。(我之前说过吗?真糟糕!)我该向谁抱怨,让他们为残疾人或视障人士做些事情?
对开发人员最有用的功能是针对错放的控制字符的错误检查以及其他检查和更正功能。CryptPad 也比记事本更有用和功能更强大,同时又不失基本简洁性和速度。
文本框鼠标/键盘操作
为了更好地理解和描述 TextBox 中鼠标和键盘的操作,我们需要定义一些术语。
- 插入点
- 在 TextBox 中键入键盘上的下一个字符将被插入的位置。此位置由一个小的闪烁的垂直条标记。不幸的是,特别是对于视力不太好的人来说,可能很难看到这个小的闪烁的垂直条。有时您可能需要单击鼠标将插入点定位在您可以预期看到它的地方。我需要让条形更宽以便更容易看到。使用“控制面板\所有控制面板项\轻松访问中心\让计算机更易于查看”来更改此设置。
- 硬换行
- 在 TextBox 中输入文本时按下 Enter 键。在当前行之后,TextBox 中出现新的一行,文本输入将在新行的开头继续。这会创建一个 CR/LF 序列,并保存在文本文件中。硬换行包含在选定的文本中,并可以粘贴到文档中。
- 软换行
- 当您启用了自动换行,并且输入的字母超出了窗口边缘时,会在 TextBox 中出现一个软换行。在当前行之后,TextBox 中出现新的一行,文本输入将在新行的开头继续。这不会创建 CR/LF 序列,也不会保存在文本文件中。软换行不包含在选定的文本中,也不会粘贴到文档中。在窗口的边缘处存在一点点混乱。如果您在边缘并键入一个空格,在您键入下一个字母之前,插入点不会移动。
- 指针
- 鼠标显示的“选择”光标,标记鼠标单击操作的应用位置。当光标在 TextBox 上时,它被称为“文本选择”,通常形状像一个又高又细的大写字母“I”,称为 I 形光标。不幸的是,特别是对于视力不太好的人来说,可能很难看到默认光标。我遇到了所有默认光标的相同问题。可以选择并创建更大的光标。Windows 标准(特大号)方案效果很好,但我选择自己的选项,并创建了我自己的巨大的“普通选择”光标。
- 单词
- “单词”的定义很复杂,但要理解换行符和其他功能很重要。一般而言,“单词”文本在空格、问号“?”、感叹号“!”、闭合大括号“}”、闭合方括号“]”、闭合圆括号“)”,竖线“|”,和连字符“-”之后,或在美元符号“$”、百分号“%”、加号“+”、反斜杠“\”,闭合大括号“{”,闭合方括号“[”,和闭合圆括号“(”之前开始。<!-- 单词测试字符串 xx~xx!xx@xx#xx$$$xx%%%xx^xx&xx*xx(xx)xx_xx+++xx=xx`xx-xx[xx]xx\\\xx|xx{xx}xx'xx;xx:xx"xx/xx.xx,xx
xx?xx --> 硬换行既是单词之前的断词符也是之后的断词符,但它本身就是一个单词,并且从不包含在另一个“单词”中。多个断词符通常组合在一起,并包含在“单词”的定义中。在单词的定义中,只包含一个前导断词符:美元符号“$”、百分号“%”、加号“+”和反斜杠“\”。标点符号,如单引号/双引号、句号、逗号、冒号和分号以及所有其他字符都包含在“单词”的定义中。
令人困惑?
这些是我观察到的 ASCII 字符规则。如果没有充分的 Microsoft 文档或广泛而仔细的测试,不可能知道这是否是一个完整的列表。ANSI 或 Unicode 定义……?
这些是 TextBox 中使用的一些鼠标快捷键。如果没有充分的 Microsoft 文档或广泛而仔细的测试,不可能知道这是否是一个完整的列表。
- 单击
- 将插入点移动到鼠标指针的当前位置。
- 右键单击
- 弹出上下文菜单。
- 双击
- 选择鼠标指针下的“单词”。
- 单击并拖动
- 选择从鼠标指针的起始位置到鼠标指针的最终位置下的文本。
- 双击并拖动
- 选择从鼠标指针的起始位置下的“单词”到最终位置下的“单词”。
- Shift + 单击
- 从插入点到指针选择文本。
- Shift + 双击
- 从插入点到指针处的“单词”选择文本。
这是 TextBox 键盘快捷键的按功能分组的列表。如果没有充分的 Microsoft 文档或广泛而仔细的测试,不可能知道这是否是一个完整的列表。
移动插入点
- 右侧
- 将插入点向右移动一个字符。当您在行尾时,插入点将移至下一行的开头。如果行尾有一个空格后跟一个软换行,则该空格将被忽略。
- 左侧
- 将插入点向左移动一个字符。当您在行开头时,插入点将移至上一行的末尾。如果行尾有一个空格后跟一个软换行,则该空格将被忽略。
- 向上
- 将插入点向上移动一行。如果前一行比当前行短,插入点将移至行尾。
- 向下
- 将插入点向下移动一行。如果下一行比当前行短,插入点将移至行尾。
- Home
- 将插入点移动到行开头。
- End
- 将插入点移动到行尾。如果行尾有一个空格后跟一个软换行,则该空格不会被忽略。
- PageUp
- 将 TextBox 窗口向下滚动,将顶行移至底行,并保持插入点在窗口中大致相同的位置。
- PageDown
- 将 TextBox 窗口向上滚动,将底行移至顶行,并保持插入点在窗口中大致相同的位置。
- Ctrl+右箭头
- 将插入点向右移动到下一个单词的开头。如果这是行中的最后一个单词,插入点将移至下一行第一个单词的开头。
- Ctrl+左箭头
- 将插入点向左移动到上一个单词的开头。如果这是行中的第一个单词,插入点将移至上一行最后一个单词的开头。
- Ctrl+Home
- 将插入点移动到文本的开头。
- Ctrl+End
- 将插入点移动到文本的末尾。
选择文本
选定的文本通过背景颜色的变化来指示。不幸的是,如果选择了一个硬换行,则没有视觉指示。这可能会引起一些困惑。
- Shift+右箭头
- 将选择范围向右扩展一个字符。
- Shift+左箭头
- 将选择范围向左扩展一个字符。
- Shift+下箭头
- 将选择范围向下扩展一行。
- Shift+上箭头
- 将选择范围向上扩展一行。
- Shift+Home
- 将选择范围扩展到行开头。
- Shift+End
- 将选择范围扩展到行尾。
- Shift+PageUp
- 将 TextBox 窗口向下滚动,将顶行移至底行,并保持插入点在窗口中大致相同的位置,扩展选择范围。
- Shift+PageDown
- 将 TextBox 窗口向上滚动,将底行移至顶行,并保持插入点在窗口中大致相同的位置,扩展选择范围。
- Shift+Ctrl+右箭头
- 将选择范围扩展到下一个单词。
- Shift+Ctrl+左箭头
- 将选择范围扩展到上一个单词。
- Shift+Ctrl+Home
- 将选择范围扩展到文本的最开头。
- Shift+Ctrl+End
- 将选择范围扩展到文本的末尾。
剪切、粘贴和撤销
- Ctrl+C 或 Ctrl+Ins
- 将选定的文本复制到剪贴板。
- Ctrl+V 或 Shift+Ins
- 从剪贴板粘贴选定的文本。当剪贴板中的内容粘贴到文档中时,它将被指示为选定文本。
- Ctrl+X 或 Shift+Del
- 将选定的文本剪切到剪贴板。
- Ctrl+Z
- 撤销上次编辑。撤销操作将指示为选定文本。
删除文本
- Del
- 删除插入点右边的字符或当前选定的内容。
- Backspace 或 Ctrl-H
- 删除插入点左边的字符或当前选定的内容。
- Ctrl+Del
- 删除到行尾或当前选定的内容。
插入文本
- 任何 ASCII 图形字符
- 在插入点位置插入键入的字符。
- Enter、Ctrl-M、Ctrl-J
- 在插入点位置插入 CR/LF,并开始新的一行。
- Tab 或 Ctrl+I
- 在插入点位置插入制表符(HT)字符。CryptPad 会将 Ctrl+I 从 TextBox 劫持,用于“首字母大写”快捷键(如果当前有选定内容)。
CryptPad 键盘快捷键
这是一个 CryptPad 功能键和键盘快捷键的字母顺序列表。与 TextBox 共享的快捷键标有星号(*)。
- Ctrl+A
- 编辑,全选
- * Ctrl+C
- 编辑,复制
- Ctrl+F
- 编辑,查找
- Ctrl+F1
- 帮助,在线内容
- Ctrl+G
- 编辑,转到
- Ctrl+H
- 编辑,替换
- Ctrl+I
- 编辑,首字母大写
- Ctrl+L
- 编辑,小写
- Ctrl+N
- 文件,新建
- Ctrl+O
- 文件,打开
- Ctrl+Q
- 工具,快速加密
- Ctrl+S
- 文件,保存
- Ctrl+T
- 编辑,转置
- Ctrl+U
- 编辑,大写
- * Ctrl+V
- 编辑,粘贴
- * Ctrl+X
- 编辑,剪切
- * Ctrl+Z
- 编辑,撤销
- F1
- 帮助,本地内容
- F3
- 编辑,查找下一个
- F5
- 编辑,日期/时间
- F6
- 工具,密码
- Shift-F3
- 编辑,查找上一个
主菜单功能
主菜单包含 CryptPad 程序执行的所有功能的菜单分组。
文件菜单
文件菜单包含处理文件操作、字符编码、加密和退出程序的典型功能。
新建
使用此选项创建一个新的空白无标题文档。
如果当前文档已被修改,系统将提供保存文档的选项。
当窗口关闭时,如果您进行了任何更改,系统将提供将其保存到文本文件的选项。
新文档将是未加密的。您可以立即设置加密字符串,以便在保存时加密文档。您可以参考 加密 部分获取更多详细信息。
新文档的默认字符编码将是 UTF-8(ASCII)。您可以参考 字符编码 部分获取更多详细信息。
打开
打开现有的文本文件进行编辑。将显示一个标准对话框,用于选择要打开的文档文本文件。
如果当前文档已被修改,系统将提供保存文档的选项。与记事本不同,除非您取消保存选项,否则文档将立即关闭。如果您取消打开,您将不会返回到文档。
加密
当前文档的加密字符串将被保留,可能用于打开的文档。如果文本文件使用的加密字符串与当前加密字符串不同,则会请求输入加密字符串。如果文本文件未加密,则当前加密字符串将被清除。
您可以参考 加密 部分获取更多详细信息。
并行更新保护
与记事本不同,CryptPad 维护文本文件处于打开状态,锁定以防止并行更改,但与文本文件读取器共享。这可以保护文本文件免遭意外的并行修改数据丢失问题。我偶尔会在记事本上遇到这种情况。您仍然可以丢失数据,但这需要通过有意的操作来实现,而不是简单的意外。
当发生任何文本文件错误时,CryptPad 会提供尝试以只读模式打开文本文件的选项。您也可以在“文件”->“打开”对话框中通过文件类型选择来指定以只读模式打开。只读文本文件不能被修改和保存,以防止意外的并行修改数据丢失问题。除非您使用“另存为”命令,否则 CryptPad 绝不会保存文本文件。
文件大小警告
如果文本文件大于约 2MB,CryptPad 程序将显示警告并要求确认才能打开。显示警告的原因是编辑大于该尺寸的文本文件会很慢。越来越大的文本文件会越来越慢,直到它可能因为将整个文本文件读取到内存中而导致程序崩溃。
字符编码选项
CryptPad 在打开时自动检测默认的 ANSI 代码页、UTF-8 和带 BOM 的 Unicode 文本文件字符编码。程序假定为 UTF-8 字符编码,除非检测到 ANSI 字符,因为 UTF-8 无法正确读取它们。ANSI 字符被误认为 UTF-8 的可能性很小(但有可能)。没有字节顺序标记(BOM)的 UTF-8 与 ASCII 完全相同,除非存在 ANSI 或 Unicode 字符。
当文本文件是无 BOM 的字符编码时,将测试其末尾是否存在 Unicode LF。如果文本文件末尾存在 Unicode LF,CryptPad 将尝试 Unicode 字符编码。一个 proper 的纯文本文件始终以 CR/LF 或仅 LF 结尾。CryptPad 在保存文本文件时会强制执行此规则。
如果发现 NUL 字节且为非 Unicode 字符编码,则文件将被标记为 字符编码 为二进制,并设置为只读。
CryptPad 允许您在打开期间强制将字符编码设置为您指定的编码。如果这不是正确的字符编码,编码错误和 NUL 字节将被忽略并替换。
您可以参考 字符编码 部分获取更多详细信息。
意外文件内容警告
如果发现未配对的 CR 或 LF(不在 CR/LF 对中),CryptPad 程序将显示警告,并建议 强制 CR/LF。
如果文本文件中存在其他非打印 ASCII/ANSI 控制字符(ANSI 空白),CryptPad 程序将显示警告。
如果在一个非二进制文本文件中发现 NUL 字符,CryptPad 程序将显示警告,因为这些必须更改为空格字符才能使 TextBox 工作。这与记事本的做法相同。
CryptPad 将拒绝打开带有备份扩展名 1、2 或 3 的文本文件。如果您想编辑这些文件,需要先重命名它们。
保存
当前文档将被保存。如果存在当前加密字符串,文本文件将被加密。
您可以参考 加密 部分获取更多详细信息。
CryptPad 在保存文本文件时使用当前的文本文件字符编码。一个 proper 的纯文本文件始终以 CR/LF 或仅 LF 结尾。CryptPad 在保存文本文件时会强制执行此规则。
您可以参考 字符编码 部分获取更多详细信息。
文本文件将保持打开状态以继续编辑。您必须选择“新建”选项才能关闭文本文件。
另存为
将显示一个对话框,用于指定文档文本文件的名称以保存当前文档。如果存在当前加密字符串,文本文件将被加密。加密文本文件的默认文本文件扩展名为 .SAFE,所有其他文本文件的默认扩展名为 .TXT。
您可以参考 加密 部分获取更多详细信息。
CryptPad 在保存文本文件时使用当前的文本文件字符编码。“另存为类型”选项可用于选择备用的文本文件字符编码。
您可以参考 字符编码 部分获取更多详细信息。
文本文件将保持打开状态以继续编辑。您必须选择“新建”选项才能关闭文本文件。
重新打开编码
这些选项将重新打开并重新读取当前打开的文本文件,强制指定字符编码。这也可以在“打开”过程中完成。这总是有效的,但如果这不是正确的字符编码,您可能会得到乱码。
您可以参考 字符编码 部分获取更多详细信息。
如果当前文档已被修改,系统将提供保存文档的选项。
二进制
使用此功能可重新打开当前打开的文本文件,强制采用二进制字符编码。内容将是只读的,并以十六进制显示。这对于检查字符编码的详细结果很有用。
ANSI
使用此功能可重新打开当前打开的文本文件,强制采用 ASCII/ANSI 字符编码。
UTF-8(ASCII)
使用此功能可重新打开当前打开的文本文件,强制采用 UTF-8 字符编码。
Unicode
使用此功能可重新打开当前打开的文本文件,强制采用“Unicode”UTF-16 字符编码。
Unicode(大端)
使用此功能可重新打开当前打开的文本文件,强制采用“Unicode(大端)”UTF-16 字符编码。
强制编码
这些选项将强制为当前打开的文本文件指定字符编码,如果您必须确定在写入文本文件时强制使用该字符编码。此更改也可以在“另存为”过程中完成。这不会更改当前正在编辑的任何文本。
您可以参考 字符编码 部分获取更多详细信息。
ANSI
使用此功能可为当前打开的文本文件强制采用 ASCII/ANSI 字符编码。CryptPad 不会强制只输入 ASCII/ANSI 文本,但如果文本包含任何无法映射到当前代码页的 Unicode 字符,在保存文本文件时会发生错误。
UTF-8(ASCII)
使用此功能可为当前打开的文本文件强制采用“UTF-8(ASCII)”字符编码。请记住,仅包含 ASCII 字符的文本文件已经是“UTF-8(ASCII)”编码的。这是所有文本文件的首选字符编码格式。
Unicode(UTF-8)
使用此功能可为当前打开的文本文件强制采用带 BOM 的“Unicode(UTF-8)”字符编码。
Unicode
使用此函数强制对当前打开的文本文件使用“Unicode”UTF-16 字符编码,不带 BOM。
Unicode(BOM)
使用此函数强制对当前打开的文本文件使用“Unicode(BOM)”UTF-16 字符编码,带 BOM。
Unicode(大端)
使用此函数强制对当前打开的文本文件使用“Unicode(Big-Endian)”UTF-16 字符编码,不带 BOM。
Unicode(大端 BOM)
使用此函数强制对当前打开的文本文件使用“Unicode(Big-Endian BOM)”UTF-16 字符编码,带 BOM。
加密
显示一个对话框,用于添加、更改或删除加密字符串。加密字符串必须至少包含 4 个 ASCII 字符。越长越好。没有特定的最大限制。大约 32 个字符是一个理想的选择。加密字符串只允许使用 ASCII 字符。
警告! 除非您记住此加密字符串,否则您将无法解密此文本文件的内容。如果您忘记此加密字符串,您将永远无法恢复加密字符串。绝对没有后门。单击“确定”按钮后,除非您记住此字符串并再次输入,否则您无法删除或更改加密字符串。
您将需要输入两次新的加密字符串以验证其内容。这是必要的,因为您在输入时将看不到加密字符串的内容。如果您输入两次相同的内容,则假定没有错误,并且您会记住加密字符串。将其设置为您一定会记住的内容。由于此项至关重要,因此对加密字符串的内容没有特别的要求。
加密函数仅支持 ASCII。非 ASCII 字符不会被加密。对于那些语言非基于 ASCII 的用户,我深表歉意。加密算法不是特别复杂,但它能有效地阻止好奇和窥探者。这并非旨在成为 CIA 的高安全性解决方案!
几乎没有人能够破解即使是单个单词的加密字符串。一个非常安全有效的加密字符串是一个简短的句子或短语,包含至少三个单词。使用词典中找不到的奇怪词语非常有效。请记住! 您绝不能忘记加密字符串,否则您将永远无法解密您的隐藏数据。
有关加密数据的更多信息,请参阅快速加密。
退出
此选项退出程序。
如果当前文档已被修改,系统将提供保存文档的选项。
编辑菜单
“编辑”菜单包含对文档进行特殊编辑的功能。
撤销
撤销最近的编辑操作(如果上次操作支持撤销)。您输入的任何文本都可以被撤销,恢复您替换的任何可选选中文本,直到您使用箭头键或鼠标移动插入符并输入新文本为止。TextBox 控件只支持一次撤销。第二次撤销将恢复原始数据。
剪切
将当前选定的文本复制到系统剪贴板并从文档中删除。如果没有选定的文本,则系统剪贴板和文档将保持不变。您可以撤销此操作,但系统剪贴板将继续保留剪切文本的副本。
无论您粘贴多少次,文本都将保留在系统剪贴板中,直到下一次剪切或复制。即使 CryptPad 程序退出,系统剪贴板也不会被清除。
复制
将当前选定的文本复制到系统剪贴板。如果没有选定的文本,则系统剪贴板将保持不变。
无论您粘贴多少次,文本都将保留在系统剪贴板中,直到下一次剪切或复制。即使 CryptPad 程序退出,系统剪贴板也不会被清除。
粘贴
将系统剪贴板文本粘贴到文档中。这将替换任何当前的选择。您可以撤销此操作。
无论您粘贴多少次,文本都将保留在系统剪贴板中,直到下一次剪切或复制。即使 CryptPad 程序退出,系统剪贴板也不会被清除。
删除
删除当前选定的文本。如果没有选中文本,则会删除插入符位置之后的字符。您可以撤销此操作。
大写
将当前选定的文本转换为大写。您可以撤销此操作。
小写
将当前选定的文本转换为小写。您可以撤销此操作。
首字母大写
在以空格分隔的单词前,将当前选定的文本转换为首字母大写。假定选择的第一个字符是一个单词的开头。您可以通过双击一个单词并输入快捷键 Ctrl+I 来执行此操作。您可以撤销此操作。
转置
“转置”函数会交换插入符左右两边的字符。我不知道您在打字时转置字符的频率有多高,但对我来说这种情况经常发生。您可以撤销此操作。
如果当前有选定的文本,此函数将不起作用。当插入符位于行首或行尾时,将不执行任何操作。CryptPad 程序仅对 ASCII 字符执行转置,因为可能会混淆识别和解析 ANSI 或 Unicode 字符。
查找
显示一个对话框,用于指定搜索模式。搜索模式的详细信息在替换函数中进行了说明。
此函数支持包含 C 类型转义字符子集的模式,用于文本文件中常见的 ASCII 控制字符。新转义字符在替换函数中进行了描述。
有一个 RegEx 复选框,用于在搜索模式中使用正则表达式语法。
查找下一个
在文档中查找下一个搜索模式匹配项。如果之前没有指定搜索模式,则会显示对话框。与记事本不同,此函数将始终向下搜索。
查找上一个
在文档中查找上一个搜索模式匹配项。如果之前没有指定搜索模式,则会显示对话框。此函数将始终向上搜索。
替换
显示一个对话框,用于指定搜索和替换模式。关于搜索模式的工作方式,有一些记事本未解释的细节,并且 CryptPad 的行为可能略有不同。当我遇到这些问题时,我会为您描述它们,而不是让您猜测和自行发现。
转义字符
此函数支持包含 C 类型转义字符子集的搜索和替换模式,用于文本文件中常见的 ASCII 控制字符。
- \n 新行(LF)
- \r 回车符(CR)
- \t 水平制表符(HT)
- \\ 反斜杠
如果在 TextBox 中为非 Regex 模式使用单个反斜杠,那么在它后面不是特殊字符时,它将被视为反斜杠。如果您尝试输入两个反斜杠进行搜索,它将被更改为一个,除非您输入四个!Regex 模式如果反斜杠后面不是正确的特殊字符,则会报错。
在查找和替换输入 TextBox 中的上下文菜单和快捷键支持新的转义字符用于粘贴、复制和剪切功能,除非选择了 Regex。
正则表达式语法
有一个 RegEx 复选框,用于在搜索和替换模式中使用正则表达式语法。这在 Microsoft .NET Framework 正则表达式文档中有详细介绍。多行模式选项已自动包含。
此函数非常复杂,在 MSDN 文档中有完整描述,但我会提供一些简单的示例。搜索模式
\r([^\n])
将定位后面不跟 LF 的 CR,替换模式
\\r$1
将 CR 更改为“\r”。接下来的字符将被拖入选择,因为它被检查以确保它不是 LF。
正则表达式语法已支持搜索模式中的转义字符,但 CryptPad 将其使用添加到替换模式中。
此示例“交替构造”使用“带表达式的条件匹配”来查找不包含单词 cat 的行。
(?(^.*cat.*$)$|^.*$)
对于替换中的“$”,请小心搜索模式,如 MSDN 文档 中所述。例如,如果您尝试使用以下搜索模式完全删除包含“cat”的行,这将留下一个悬空 LF。
^.*cat.*$
相反,您可以使用此搜索模式正确删除该行。
^.*cat.*\r\n
警告!在复制和粘贴正则表达式时,我曾多次被一个烦人的多余空格困扰。这会导致某些表达式意外失败,而另一些表达式的行为也异常。
警告!在使用正则表达式的查找和替换中的“^”和“$”时,我也曾多次感到困惑,因为使用“$”进行替换会创建一个悬空的 LF,并且无法正确搜索。这会导致某些表达式意外失败,而另一些表达式的行为也异常。我发现,在替换的搜索模式中使用“\r\n”而不是“$”效果更好。
恢复插入符位置
“替换”对话框中的“全部替换”按钮具有记事本中没有的特殊功能。记事本在“全部替换”后会将插入符位置更改为文档顶部,您将失去对编辑位置的跟踪。CryptPad 会记住当前插入符的行和列位置。CryptPad 在“全部替换”后会尝试恢复插入符位置。CryptPad 甚至会尝试将窗口滚动到相同的位置。当“全部替换”更改了插入符位置之前的行数或插入符位置之前的行字符数时,插入符位置的恢复将不准确。
转到
显示当前插入符位置的行号,并允许您指定一个新行来更改当前插入符位置。当启用自动换行时,行号是换行后的行数,因此它可能与禁用自动换行时的行数不同。
当您输入程序提供的行号时,通常需要确保禁用自动换行,否则您将转到错误的行。
全选
选择文档中的所有文本。文本不会复制到剪贴板,直到您指定复制。
日期/时间
以 ISO 8601 标准的通用日期和时间格式插入日期和时间。使用本地时间,但不指明时区。这是单独的日期和时间字段,因此它们之间用空格分隔,符合标准要求。这不应与用“T”字符分隔的合并日期和时间的标准格式混淆。
示例
2013-03-24 15:55
如果当前有选定的文本,它将被替换。假定选定的文本是旧的日期和时间值。您可以撤销此操作。
工具菜单
- 密码
- 快速加密
- 查找下一个非 ASCII 字符
- 查找最长行
- 显示下一个 ANSI 空格
- 强制 CR/LF(Windows)
- 强制 LF(UNIX)
- 标记悬空 CR 或 LF
- 硬换行
- 取消换行
- 修剪
- 命令行
- 自动备份
“工具”菜单包含 CryptPad 程序添加的一些其他特殊选项。
密码
在文档中插入一个自动生成的随机密码。随机化从大写/小写 ASCII 字母和数字中选择 16 个字符。这对于创建唯一的、超机密的、高度安全的网站密码的加密文本文件特别有用。不要将其用作加密字符串!这将不可能记住。
示例
EHbKLQZRRv53VN5K
如果当前有选定的文本,它将被替换。假定选定的文本是旧密码。您可以撤销此操作。
当您为网站使用随机密码生成时,复杂的密码将存储在加密的文本文件中,这样您就不必记住它。加密文本文件中的典型行或一系列行将包含网站地址、电子邮件地址/用户名和密码。这可以用于快速简单地复制/粘贴网站地址,然后复制/粘贴登录用户名,最后复制/粘贴密码。不幸的是,我发现一些困难的网站不允许您复制和粘贴密码。这是一种不良的安全措施,因为您可能希望粘贴一个您绝不可能记住或不想输入的密码。可以轻松延迟多次粘贴以限制密码黑客攻击。
快速加密
使用当前的加密字符串,将明文转换为加密文本。如果不存在加密字符串,将请求一个。此功能特别适用于将加密文本复制和粘贴到电子邮件或即时消息中。
您可以通过检查加密文本是否始终以加密前缀“~!@#$”开头来识别加密文本。如果已显示加密文本,则此命令会将加密文本转换为明文。
1.0 版加密前缀是“~!@#”。如果您需要知道,只需删除第 5 个字符(“$”)和第 6-13 个字符(十六进制校验和)即可恢复 1.0 版兼容性。
警告!如果您在显示加密文本时更改了任何其他内容,您将无法解密该文本。
加密前缀“~!@#$”必须是文本的开头字符才能反转加密。2.0 版在加密前缀之后有一个八位十六进制字符校验和,用于验证数据是否未被修改或损坏。还有一个八位十六进制字符校验和,用于验证当前加密字符串是否确实适用于此文本。
如果在任何编辑器中更改了任何加密文本,您将失去永远解密该文本的能力。访问您的文本文件的人可以销毁您的加密数据,但永远无法看到它。
您可以参考 加密 部分获取更多详细信息。
查找下一个非 ASCII 字符
查找并选择插入符或当前选定内容之后的下一个非 ASCII 字符。
查找最长行
查找第一个最长行并将插入符放在行尾。此功能忽略自动换行。请记住,TextBox 始终在 1024 个字符处换行,因此没有任何行的长度可以超过此值。
显示下一个 ANSI 空格
在文本文件中的插入符或当前选定内容之后找到的下一个不可打印的 ASCII/ANSI 字符将被更改为字符串“\xnn”并被选中。“nn”将是字符的十六进制值。值将始终为“\x01”(空格)、“\x1c”(无空格)、“\x1d”(无空格)、“\x1e”(无空格)、“\x1f”(无空格)、“\x81”(无空格)、“\x8d”(无空格)、“\x8f”(无空格)、“\x90”(无空格)、“\x9d”(无空格)或“\xa0”(空格)。这些值表示不显示任何内容的字符,因此在典型字体中它们是不可见的。其中一些字符显示为空格,有些是零宽度且根本不显示。
“\xa0”字符是不可中断空格。在 HTML 文件中,它创建为“ ”。如果您需要在文本文件中使用它,可以使用 Alt+0160 键盘快捷键输入。
此函数会忽略悬空的 CR 和 LF 字符,这些字符也显示为空格。它们由标记悬空 CR 或 LF函数识别。
强制 CR/LF(Windows)
首先将所有 CR/LF 更改为 LF,然后将所有剩余的 CR 更改为 LF,最后确保每个 LF 都是 CR/LF。这是 Windows 操作系统使用的文本文件的正常条件。这是正常的编辑条件。一个有效的纯文本文件始终以 CR/LF 或仅 LF 结尾。CryptPad 在保存文本文件时会强制执行此操作。
强制 LF(UNIX)
首先将所有 CR/LF 更改为 LF,然后将所有剩余的 CR 更改为 LF。这是 UNIX 类型操作系统使用的文本文件的正常条件。这不是正常的编辑条件。此条件通常仅在关闭和保存之前创建。许多 CryptPad 和 TextBox 显示和编辑功能在 Unix 文本文件上将无法正常工作。一个有效的 Unix 纯文本文件始终以 LF 结尾。CryptPad 在转换文本文件时会强制执行此操作。
标记悬空 CR 或 LF
在文本文件中找到的第一个悬空的 CR 或 LF 将被更改为字符串“\r”或“\n”并被选中。在正常文本文件中将没有悬空的 CR 或 LF。如果您在打开文本文件时对警告提示响应“确定”或在使用“强制 CR/LF”工具后,也将没有。
硬换行
通过插入 CR/LF 将行宽永久设置为当前窗口宽度。此函数只有在启用自动换行时才起作用。行尾会留一个空格,以便以后进行解包或修剪。无法通过简单的替换来找到换行符的末尾。
当您使用 CryptPad、记事本或任何编辑器撰写段落时,将行限制在适合阅读的短宽度(约 60 个字符)将非常有用。报纸专栏展示了非常窄的宽度。一本典型的书的栏宽约为五到六英寸。
启用自动换行后,行宽将自动适应窗口大小,同时删除和添加内容。硬换行功能对于将撰写时使用的自动换行转换为适合粘贴(例如在电子邮件中)的短行非常有用。
取消换行
通过删除后面跟空格的 CR/LF 来取消换行。这些悬空空格通常由硬换行创建。使用修剪工具后,取消换行将不再起作用。这允许继续撰写,删除和添加内容,同时自动调整到窗口宽度。
这只是一个预定义的替换,“ \r\n”替换为“ ”。
修剪
修剪行开头或结尾的任何空格。确保没有多余的空格是一项整洁的做法。假定使用 Tab 而不是空格进行缩进。您可能选择在硬换行后使用修剪,也可能不使用。如果您使用,将无法取消换行。
这只是一个预定义的替换,“ \r\n”替换为“\r\n”,以及“\r\n ”替换为“\r\n”。
命令行
显示启动时的当前目录和程序启动时提供的命令行参数。这对于理解命令行自动化功能的环境特别有用。CLA 错误会自动显示此信息。
自动备份
此菜单选项允许您选择自动备份选项。您可以选择 0 到 3 个备份。执行备份时,file.ext 重命名为 file.ext.1,file.ext.1 重命名为 file.ext.2,依此类推,直到选定的备份数量。
备份仅在打开后第一次保存时发生。我习惯于在平铺窗口中编辑 HTML,并使用 Internet Explorer (IE) 显示 HTML。我会在编辑时多次保存文本文件,并刷新 IE 窗口以查看结果。我不希望每次中间保存都进行备份。如果您想强制在编辑时进行备份,则需要再次打开文本文件。
CryptPad 将拒绝打开带有备份扩展名 1、2 或 3 的文本文件。如果您想编辑这些文件,需要先重命名它们。
格式菜单
这些选项更改了 CryptPad TextBox 中文本显示的格式。
自动换行
切换自动换行。长度超过 1024 的 TextBox 行始终会被换到第二显示行,即使在单词中间也会断开。
当启用自动换行时,TextBox 行将根据当前窗口的宽度进行换行。TextBox 窗口自动换行的规则很复杂。通常,换行发生在“单词”边界。
字体
显示字体对话框,用于选择显示和编辑文档时使用的字体。Lucida Console 12pt 是原始设置。
字体颜色
显示颜色对话框,用于选择显示和编辑文档时使用的字体颜色。黑色是原始设置。我更喜欢将字体颜色设置为黄色,背景颜色设置为蓝色,这是一种非常舒缓的高对比度选项,可以替代无聊的黑白色。
背景颜色
显示颜色对话框,用于为编辑期间的 TextBox 选择不同的背景颜色。白色是原始设置。我更喜欢将字体颜色设置为黄色,背景颜色设置为蓝色,这是一种非常舒缓的高对比度选项,可以替代无聊的黑白色。
视图菜单
此菜单允许您选择要在状态栏中显示的信息。如果未选择任何项目,则不会显示状态栏。如果窗口不够宽以显示所有内容,则只会显示适合显示的前几个项目。
行/字符
切换在状态栏中显示当前行号和当前行中插入符的字符位置。这不一定与列号相同,如果行中有制表符。根据是否启用了自动换行,同一行的行号可能会有所不同。
之前/之后
切换在状态栏中显示插入符之前的字符数和插入符之后的字符数。
行/字符数
切换在状态栏中显示文本文件中的总行数和总字符数。
小心!在自动换行模式下,当前行号是针对换行后的行,但总行数仍然是实际的行数。另请注意,总字符数包括 CR/LF 字符以及文本中的任何其他控制字符。总字符数仅在具有 ANSI 字符编码或 UTF-8(仅包含 ASCII 字符)的文本文件的情况下才与文件大小匹配。
字符编码
切换在状态栏中显示文本文件的字符编码。典型的文本文件字符编码
“二进制”
当自动字符编码识别在非 Unicode 文件中检测到 NUL (“\x00”) 字节时,它将假定文件是二进制文件。数据被更改为十六进制/ASCII 显示。文件编辑也设置为只读。十六进制/ASCII 显示的列设计最适合使用 Unicde 等宽字体,如 Lucida Console 的原始设置。
如果您在打开文本文件时指定了字符编码,NUL 字节将被更改为空格,而不会将字符编码更改为二进制。将忽略任何字符编码失败。您还可以强制重新打开并指定字符编码。这是恢复损坏字符文本文件的推荐方法。
可以使用“另存为”来保存二进制字符编码,但这会导致文本文件包含十六进制转换,而不是原始文件内容。这可能很有用,但可能不是您想要的。每种字符编码类型都演示了二进制字符编码,以说明该字符编码的结果。下面的字符串被粘贴到一个新文件中。字符编码被强制并重新打开为二进制。
Unicode Č - ANSI 兼容“菜单”
- “Windows-1252”
也称为“ANSI”、“ISO-8859-1”和“西欧(Windows)”。这对于许多旧计算机系统或使用非 ASCII 字符的文本文件来说是典型的。此字符编码是针对本地代码页的,根据计算机系统的配置方式,您的计算机上可能不同。ANSI 字符是大于 127 的 8 位值。
除非您打开包含 ANSI 字符的非 ASCII 文本文件,或者您已指定使用 ANSI 字符编码保存非 ASCII 文本文件,否则您通常不会在 CryptPad 中看到此字符编码。
请注意,非 Windows-1252 字符已被 Windows 更改为兼容的 Windows-1252 字符。
Unicode C – ANSI 兼容“菜单”
55 6E 69 63·6F 64 65 20·43 20 2D 20·41 4E 53 49 Unicode C - ANSI 20 63 6F 6D·70 61 74 69·62 6C 65 20·93 4D 65 6E compatible ·Men 75 94 0D 0A· u···
- “UTF-8 (ASCII)”
此字符编码兼容 ASCII,因为它不在文本文件开头使用字节顺序标记(BOM)。这是所有当前文本文件的推荐字符编码。UTF-8 字符使用 8 位表示非 ASCII 字符,但这些总是特殊的 8 位字符对或簇。特殊编码方法使得 UTF-8 能够以高可靠性被识别为非 ANSI。
CryptPad 也会使用此字符编码打开 ASCII 文本文件。此字符编码完全适用于只包含 ASCII 字符的文本文件,并且不会在为任何期望 ASCII 字符的程序创建 ASCII 文本时引起问题。此字符编码还允许您输入 Unicode 字符,这会给一些期望仅 ASCII 或 ANSI 的旧程序带来问题。
UTF-8 字符很容易被寻找 ANSI 字符的旧程序误认为是 ANSI 字符。查看文本文件内容但使用 ANSI 解码的人通常会立即识别出字符模式不匹配。ANSI 字符通常不会被寻找 UTF-8 字符的新程序误认为是 UTF-8 字符。UTF-8 字符遵循特定的模式。
55 6E 69 63·6F 64 65 20·C4 8C 20 2D·20 41 4E 53 Unicode ·· - ANS 49 20 63 6F·6D 70 61 74·69 62 6C 65·20 E2 80 9C I compatible ··· 4D 65 6E 75·E2 80 9D 0D·0A Menu·····
- “Unicode (UTF-8)”
这与 UTF-8 (ASCII) 字符编码相同,但它使用 BOM。此字符编码不适用于需要 ASCII 文本文件的程序,即使文本文件仅包含 ASCII 字符,因为 BOM 会将非 ASCII 字符写入文本文件开头。大多数当前程序和编辑器(如记事本和 CryptPad)都能毫无问题地使用此字符编码,但旧程序可能会以神秘的方式失败。
EF BB BF 55·6E 69 63 6F·64 65 20 C4·8C 20 2D 20 ···Unicode ·· - 41 4E 53 49·20 63 6F 6D·70 61 74 69·62 6C 65 20 ANSI compatible E2 80 9C 4D·65 6E 75 E2·80 9D 0D 0A· ···Menu·····
- “Unicode”
也称为“UTF-16”,文本文件不以 BOM 开头。此字符编码中的所有字符都使用 16 位。此字符编码很少用于 Windows 程序的文本文件中。程序员需要注意的是,大多数 Windows 程序在内部都使用此格式表示所有字符。
55 00 6E 00·69 00 63 00·6F 00 64 00·65 00 20 00 U·n·i·c·o·d·e· · 0C 01 20 00·2D 00 20 00·41 00 4E 00·53 00 49 00 ·· ·-· ·A·N·S·I· 20 00 63 00·6F 00 6D 00·70 00 61 00·74 00 69 00 ·c·o·m·p·a·t·i· 62 00 6C 00·65 00 20 00·1C 20 4D 00·65 00 6E 00 b·l·e· ·· M·e·n· 75 00 1D 20·0D 00 0A 00· u·· ····
- “Unicode (BOM)”
也称为“UTF-16”,文本文件以 BOM 开头。此字符编码中的所有字符都使用 16 位。此字符编码很少用于 Windows 程序的文本文件中。
FF FE 55 00·6E 00 69 00·63 00 6F 00·64 00 65 00 ··U·n·i·c·o·d·e· 20 00 0C 01·20 00 2D 00·20 00 41 00·4E 00 53 00 ··· ·-· ·A·N·S· 49 00 20 00·63 00 6F 00·6D 00 70 00·61 00 74 00 I· ·c·o·m·p·a·t· 69 00 62 00·6C 00 65 00·20 00 1C 20·4D 00 65 00 i·b·l·e· ·· M·e· 6E 00 75 00·1D 20 0D 00·0A 00 n·u·· ····
- “Unicode (Big-Endian)”
此字符编码通常仅用于非 Windows 计算机的文本文件。此字符编码不使用 BOM。
FE FF 00 55·00 6E 00 69·00 63 00 6F·00 64 00 65 ···U·n·i·c·o·d·e 00 20 01 0C·00 20 00 2D·00 20 00 41·00 4E 00 53 · ··· ·-· ·A·N·S 00 49 00 20·00 63 00 6F·00 6D 00 70·00 61 00 74 ·I· ·c·o·m·p·a·t 00 69 00 62·00 6C 00 65·00 20 20 1C·00 4D 00 65 ·i·b·l·e· ··M·e 00 6E 00 75·20 1D 00 0D·00 0A ·n·u ·····
- “Unicode (Big-Endian BOM)”
此字符编码通常仅用于非 Windows 计算机的文本文件。此字符编码使用 BOM。
FE FF 00 55·00 6E 00 69·00 63 00 6F·00 64 00 65 ···U·n·i·c·o·d·e 00 20 01 0C·00 20 00 2D·00 20 00 41·00 4E 00 53 · ··· ·-· ·A·N·S 00 49 00 20·00 63 00 6F·00 6D 00 70·00 61 00 74 ·I· ·c·o·m·p·a·t 00 69 00 62·00 6C 00 65·00 20 20 1C·00 4D 00 65 ·i·b·l·e· ··M·e 00 6E 00 75·20 1D 00 0D·00 0A ·n·u ·····
帮助菜单
“帮助”菜单包含查看帮助和程序信息的选项。
在线内容
此选项将打开网站“http://www.frank-t-clark.com/Professional/Papers/CryptPad/CryptPad.html”,其中包含当前版本程序的在线文档。这可能与您正在使用的版本不匹配。网站经常更新额外的文档和版本。
此网页可以保存到程序目录下的“CryptPad.html”文件中。这将更新本地内容。除非从网站将其他页面和图像复制到目录,否则页面上的链接可能会失败。如果程序安装在“Program Files”目录中,除非您具有管理员权限,否则您将无法保存文件。
本地内容
此选项将打开本地网页文件“CryptPad.html”,其中包含程序的本地版本文档。该文件应与程序文件位于同一目录中。除非从网站将其他页面和图像复制到目录,否则页面上的链接可能会失败。
当您不连接到 Internet 时,此选项很有用。此帮助文件和最小图形文件包含在下载的 zip 文件中。
关于
此选项显示程序版本号和其他信息。
命令行自动化
CryptPad 程序支持命令行自动化。可以通过命令行调用放置命令来自动化某些编辑器功能。通过命令行处理大量文本文件会比您预期的慢,因为每次启动 CryptPad 时,整个 GUI 仍会打开。此过程会为每个命令行调用闪烁 GUI,每次调用大约需要一秒钟。
CryptPad 程序对命令行的更改与 Notepad 的命令大相径庭。我认为 Notepad 令人困惑,因为它从命令行打开文本文件,但不使用文本文件的目录用于“打开”或“另存为”对话框。在这些对话框中,它会记住最后使用的目录。CryptPad 程序不会重复这种混淆!使用 CryptPad 脚本的附加功能也可能存在混淆。
以下是 CryptPad 程序实现的功能
- 当 CryptPad 会话开始时,它使用命令行的当前目录启动。命令行的任何文件名(可选择相对引用)都像 Notepad 一样打开。
- 文本文件打开后,CryptPad 会话的当前目录将更改为已打开文本文件的目录。
- “打开”和“另存为”对话框将从 CryptPad 会话的当前目录开始。
- 当通过“打开”或“另存为”对话框更改目录,从而更改已打开文本文件的位置时,在打开文本文件时,它将更改 CryptPad 会话的当前目录。
- 当使用 CryptPad 脚本时(仅从命令行可用),CryptPad 会话的当前目录将针对脚本文件打开时更改,但不会针对脚本中的文本文件引用或在脚本之后在命令行上提供的文本文件更改。所有相对引用都指向脚本文件的目录。
通常,单个命令行参数是用于编辑的文本文件名。这允许从命令行选择一个文本文件进行编辑。命令行调用是支持“打开方式”的方式。
从命令行操作文本文件时,有一个特殊模式,其扩展名为 .CryptPad,例如“script.CryptPad”。这些文件被读取为脚本文件,用于命令行自动化。可选的第二个命令行参数指定一个要使用脚本自动化编辑的文本文件。这允许使用相同的脚本处理多个文本文件,而无需编辑文件名。当 .CryptPad 扩展名的文本文件与打开命令一起使用时,没有特殊含义。
CryptPad 支持在命令行上仅指定一个文档文本文件进行编辑或使用脚本。如果存在多个命令行参数(或与第一个参数为 .CryptPad 脚本文件一起的两个参数),则第一个参数必须是“DO”。任何自动化参数都不区分大小写。第二个参数指定要执行的函数。附加参数为特定的自动化函数提供附加信息。大多数自动化函数执行后,程序将立即退出。如果文本文件确实已更改,则会保存文本文件。
假设 .SAFE 和 .CryptPad 在注册表中已标识为“打开方式”的示例命令行
file.safe script.CryptPad script.CryptPad file.safe |
示例 script.CryptPad 文件
do replace "first value" "first string" do replace "second value" "second string" |
标准的“打开方式”关联不允许为 .CryptPad 文件提供参数。CryptPad 项目中提供的 CryptPadAdd.REG 文件包含正确的注册表项以允许参数。
CryptPad 将返回 0 的错误级别,表示成功编辑了文本文件。值为 1 表示未保存或更改任何文本文件。错误级别 2 表示命令行错误。命令行错误还会显示错误并暂停执行,直到错误被确认。命令行或自动化脚本错误将中止保存对当前文本文件的任何更改。
以下是一个经过测试的 Windows 7 CMD 脚本示例,该脚本将当前目录中的所有文本文件更改为 UTF-8,假设 CryptPad 程序位于 Documents 目录的 CryptPad 子目录中。CMD 脚本显示找到并实际更改的文本文件数量。
@echo off rem rem CryptPadx.cmd - Automation test rem set p=%userprofile%\Documents\CryptPad\CryptPad.exe set /a total=0 set /a count=0 for %%f in (atest*.txt) do call :change %%f echo Total: %total% Changed: %count% pause goto :EOF :change echo Checking %1 set /a total=total+1 %p% do utf-8 %1 echo Change error %errorlevel% if not errorlevel 1 goto :EOF set /a count=count+1 goto :EOF |
这是一个备选示例,它依赖于 CryptPadAdd.REG 文件提供的 .CryptPad 关联。此方法不需要知道 CryptPad.exe 文件的位置,因为它已嵌入注册表中。
@echo off rem rem CryptPadx.cmd - Automation test rem echo do utf-8 >script.CryptPad set /a total=0 set /a count=0 for %%f in (atest*.txt) do call :change %%f echo Total: %total% Changed: %count% pause goto :EOF :change echo Checking %1 set /a total=total+1 script.CryptPad %1 echo Change error %errorlevel% if not errorlevel 1 goto :EOF set /a count=count+1 goto :EOF |
CryptPad 程序菜单中有一个命令行函数,用于显示程序启动时提供的命令行参数。这对于理解和调试命令行自动化功能非常有用。
执行脚本 文件名
从(非 ANSI!)文本文件中读取自动化脚本命令。这主要用于允许多个自动化替换命令。文件中的所有自动化脚本命令都以“DO”开头。不能在自动化脚本中使用(嵌套)SCRIPT 命令。此命令只能直接从命令行使用。使用 .CryptPad 扩展名的特殊“打开方式”关联比在 CryptPadAdd.REG 文件中描述的更容易。
示例脚本文件
do edit test.txt do replace "first value" "first string" do replace "second value" "second string" |
任何错误都将中止自动化脚本并返回错误级别 2。
执行 ANSI [文件名]
打开指定的文本文件名或使用现有的打开文本文件。执行强制 ANSI功能。如果字符编码已经是 ANSI,则文本文件及其修改日期不会改变。当作为命令行给出时,保存文本文件并退出。否则,保持打开状态以进行其他自动化脚本处理。
请记住,只有 ASCII 字符的文本文件编码为“UTF-8 (ASCII)”。它将被保存,并且其修改日期将被更改,但文本文件内容不会改变。
执行 UTF-8 [文件名]
打开指定的文本文件名或使用现有的打开文本文件。执行强制 UTF-8 (ASCII)功能。如果字符编码已经是 UTF-8 (ASCII),则文本文件及其修改日期不会改变。当作为命令行给出时,保存文本文件并退出。否则,保持打开状态以进行其他自动化脚本处理。
请记住,只有 ASCII 字符的文本文件已编码为“UTF-8 (ASCII)”。
执行只读 文件
以只读方式打开指定的文本文件,但不要退出并允许查看。这允许从 Windows Explorer 上下文菜单进行只读编辑。注册表示例文本文件说明了如何实现此功能。此功能仅用于命令行,并且将中止自动化脚本。
执行编辑 文件
打开指定的文本文件。任何先前打开的文本文件都将被关闭并保存。此命令主要用于自动化脚本,但也可以从命令行打开文本文件。这是从命令行打开 .CryptPad 文件进行编辑的唯一方法。也可以通过 CryptPad 程序内的“文件”->“打开”菜单选项打开 .CryptPad 文件进行编辑。
执行替换 搜索字符串 替换字符串
此命令在当前打开的文本文件中执行自动化的字符串替换所有(忽略大小写)功能。此命令仅用于自动化脚本。
示例
DO EDIT test.txt DO REPLACE "testing" "implemented" |
当引号是字符串的一部分时,它前面会加上反斜杠。此函数支持 C 类型转义字符处理的子集,如替换函数中所述。
警告!尝试从命令行使用 echo 命令创建引号以嵌入自动化脚本不起作用。在这种情况下,您可以使用“\q”表示引号。
执行替换匹配 搜索字符串 替换字符串
此命令与 DO REPLACE 类似,但在当前打开的文本文件中执行自动化的字符串替换所有(匹配大小写)功能。此命令仅用于自动化脚本。
执行 Regex 搜索字符串 替换字符串
此命令与 DO REPLACE 类似,但在当前打开的文本文件中使用正则表达式语法执行自动化的字符串替换所有(忽略大小写)功能。此命令仅用于自动化脚本。
执行 Regex 匹配 搜索字符串 替换字符串
此命令与 DO REGEX 类似,但在当前打开的文本文件中执行自动化的字符串替换所有(匹配大小写)功能。此命令仅用于自动化脚本。