一个微软自带的 notepad 所导致的问题

这篇具有很好参考价值的文章主要介绍了一个微软自带的 notepad 所导致的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简 述: 纪录一个 Microsoft 自带的 notepad 所导致的问题,关于对 回车换行 的解析。

测试小姐姐,报一个 bug 让康康先,说软件的日志在 Win10 x64 上,输出显示会多一行空格,而 Win7 x86 下则不会多此空行。我听后???同一个 .dll 还能跑出不同效果来????


本文初发于 “偕臧的小站”,同步转载于此。


背景

本想去敏后截图,但想了下还是直接写了例子演示,大概如图的 bug;💻为 win10 21H2 📎 win7 sp1


验证一番,确实可以复现,反而更加迷惑了。难道是对行尾结束标志,发生了历史演变???而恰前几天有写一篇如何修改 Visual Studio 行尾标志的文章 『Visual Studio实际仅增删数行,却显示文件所有行均发生变更』。

赶紧去查查 “回车”、“换行” wiki 历史的区别。再调试一下代码输出,看看是不是历史的演变原因?


回车换行CRLF

前辈们创建了文字,书写了一行文字;想要换行继续写,就创建了一个『换行的 标记』,自然就需要使用某个符号来表示此换行的标记。


打印机时代

此时还电脑还没有出现,打印机完成一个『换行的 操作』操作,需要执行 回车 + 换行 两个动作。

  • 『回车』:将游标移动到当前行的行首
  • 『换行』:将游标移动到当前行的下一行

用个视频感受一下: How to Use a Typewriter


计算机时代

计算机出现了,照搬一些打印机的习惯,则两个动作被保留下来了。


回车符(CR)和换行符(LF)是文本文件用于标记换行的控制字符(control characters)或字节码(bytecode)。

  • CR = Carriage Return,回车符号(\r,十六进制 ascii 码为0x0D,十进制 ascii 码为13),用于将鼠标移动到行首,并不前进至下一行。
  • LF = Line Feed,换行符号( \n, 十六进制 ascii 码为 0x0A,十进制 ascii 码为10)。

紧邻的 CR 和 LF(组成 CRLF,\r\n,或十六进制 0x0D0A)将鼠标移动到下一行行首。(Windows 操作系统默认的文本换行符为 CRLF;Linux 以及 macOS 系统默认使用 LF,早期的 mac os 系统使用 CR 换行。)


需要用一个字符来表示『换行的 标记』。至于历史原因和想法的争议,Windows 使用了两个字符表示,Linux 和 MacOS 均是一个字符表示,其现在的规则如下:

  • windows:CR+LF 表示此标记。两个标记按照此顺序且同时出现才被认为是

  • Linux / MacOS:LF 表示此标记。

  • 早期的 MacOS :CR 表示此标记。 MacOS 9 版本及之前。


感兴趣更详细,可参考 mozilla.org 和 notepad++ 的这两篇文档:

  • mozilla.org/CRLF

  • 【详解】回车 换行 0x0D 0x0A CR LF \r \n的来龙去脉


分析

有了上述知识储备,调试一下源码,发现打印每个文件路径时,会拼接字符串,每次都会添加 \r\n 字符串来表示换行。

写一个小例子验证下区别,分别拿到 win10 和 win 7 下去跑一下,使用 notepad++ 打开,两次效果都是一样的。

QFile file("D:/ExCRLF.txt");
file.open(QIODevice::WriteOnly | QIODevice::Text);
file.write("(abcdefg1234hijk)\r[FOXES]");
file.write("(abcdefg1234hijk)\n[FOXES]");
file.write("(abcdefg1234hijk)\r\n[FOXES]");
file.write("(abcdefg1234hijk)\n\r[FOXES]");
file.close();

在 Win10 21H2 中运行效果


结论: 在 win 系统中,一个"\n" 的 C++ 字符会被标记为一个 "CRLF" 存储到文本文件中;一个"\r" 的 C++ 字符会被标记为一个 "CR" 存储到文本文件中。而在 notepad++ 中,无论是 "LR""CR""CRLF" 都会被解析为换行操作后显示出来;但是早期的 win 下的 notepad 记事本不是,只能够解析 "CRLF" ;而这个 bug 一直到 2018.05 在 win10 中才被修复; 这是在微软维护 notepad 那个老哥写的 blog: Introducing extended line endings support in Notepad 。

最终就是展示到眼睛看到的效果。

  • "\r""CR" 被 notepad++ 解析为换行;早期 notepad 不做换行解析
  • "\n""CRLF" 被 notepad++ 解析为换行;早期 notepad 不做换行解析
  • "\r\n""CR CRLF" 被 notepad++ 解析为换行;早期 notepad 做换行解析

真相图,同一个 txt 在 win7 下的早期记事本中解析错误,而 notepad++ 解析正确。


解决

上面分析可知,修改此 bug 的最好方式就是不作为修改,谁让软件生成的日志 .txt,默认用 windows 自带 notepad 打开,且系统保持向上兼容到 win7、和 win xp。也算是一种妥协!

若是想要解决跨平台,解析来自不同的系统的文件,判定收取的文件的换行是哪一个?可参考 QString::split() and “\r”, “\n” and “\r\n” convention


系列地址

QtExamples 【ExCRLF】,测试例子和打包二进制见此文件夹,自行查看体验

欢迎 star ⭐ 和 fork 🍴这个系列的 C++ / QT / DTK 学习,附学习由浅入深的目录。文章来源地址https://www.toymoban.com/news/detail-464393.html

到了这里,关于一个微软自带的 notepad 所导致的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CentOS下多网卡绑定多IP段时导致只有一个会通的问题解决

    CentOS下多网卡绑定多IP段时导致只有一个会通的问题解决 虚拟机配置多个网络地址,结果同时只能有一个ip是通的, 原因:Linux默认开启了反向路由检查导致的,比如说外面访问eth0的网卡,而网关在eth1上,又或者从eth0出的流量,而网关在eth1上,此时会检查到网关不在同一个

    2024年02月10日
    浏览(29)
  • 如何彻底删除微软自带输入法

    1. 按住键盘 win+r 输入 regedit 打开注册表(允许此应用对设备进行更改) 2. 输入 计算机HKEY_LOCAL_MACHINESOFTWAREMicrosoftCTFTIP 3.回车,右键删除 {81d4e9c9-1d3b-41bc-9e6c-4b40bf79e35e} 文件夹 ​ 以免有误,可先备份。 如有发现把自己的搜狗输入法一起删掉了,只需要再重装一下即可。 文

    2024年02月11日
    浏览(27)
  • seatunnel hive source 未设置分隔符导致多个字段合并成一个的问题定位解决

    seatunnel hive source 未设置分隔符导致多个字段没有切分全保存在一个字段中了,翻看源码发现分隔符是是通过delimiter设置的,只要设置这个delimiter=\\\",\\\"就可以了。 设置这个属性 delimiter=“,” 他的默认值是u0001,如果没有设置delimiter属性则会根据文件类型判断,如果是csv则使用”,”

    2024年02月16日
    浏览(37)
  • 【MySQL实践】一个隐蔽的问题导致 Field ‘xxx‘ doesn‘t have a default value

    最后在公司的后台系统上遇到了一个线上问题,是在插入某个表数据的时候出现了数据库的插入异常,即: java.sql.SQLException: Field \\\'xxx\\\' doesn\\\'t have a default value ,这其实是一个比较常见的异常,一般在 字段不能为null时 ,如果没有 显式的指定对应字段的值 就会抛出这个异常。

    2024年01月24日
    浏览(30)
  • Win10自带微软输入法的全拼双拼一键切换

    将下面的代码保存为bat文件运行即可 保存的时候注意格式选择ANSI,如果用utf-8的格式中文会有乱码。 手动设置的路径: 开始菜单→设置→时间和语言→区域和语言→中文→选项→微软拼音→选项→微软双拼/全拼 (2021-02-21 最新版win10已经可以右键中英文图标→设置→常规→

    2024年02月11日
    浏览(42)
  • 实战攻防演练--利用微软自带Certutil命令ByPassAV上传C2

    Certutil.exe是Windows操作系统中的合法程序,主要用于管理证书相关操作。它提供了转储和显示证书颁发机构(CA)的配置信息、配置证书服务、备份和还原CA组件,以及验证证书、密钥对和证书链等功能,然而,由于其功能强大,很多攻击者滥用Certutil.exe程序将其用于攻击辅助

    2024年02月08日
    浏览(29)
  • OCR - 微软windows 11系统自带的Windows OCR功能初体验

    一、Power Automate简述         最近再了解一些ocr的相关信息,从一些网站上上看到微软的免费系统实用工具套件中包含ocr识别/pdf文本提取等。         什么是Power Automate?        Windows 11 允许用户通过预装的 Power Automate 应用创建自动化。 Power Automate 是一个低代码平台,

    2024年02月05日
    浏览(40)
  • Win11自带微软输入法怎么输入π及其他希腊字母

    如果用搜狗等第三方输入法的话就没有这些问题了,各种符号很方便。 自带的输入法输入 pi 和 pai 都不能正常输入 π pi π 参考文章 https://www.cnblogs.com/qq-757617012/p/14078133.html 如果用自带的输入法可以采用以下方式 输入 uuxl xl表示“希腊”,即可看到各种希腊字母,其中即包括

    2024年02月09日
    浏览(43)
  • Win10自带输入法怎么删除-Win10卸载微软输入法的方法

    Win10 自带输入法怎么删除?Win10系统自带输入法就是微软输入法,这个输入法满足了很多用户的输入需求。但是,有些用户想要使用其它的输入法,这时候就想删除掉微软输入法。下面小编给大家介绍最简单方便的卸载方法吧。 Win10卸载微软输入法的方法: 1. 在任务栏的语言

    2024年02月07日
    浏览(36)
  • 一个简单的Web程序(详解创建一个Flask项目后自带的一个简单的Web程序)

    程序代码截图如下:  在创建 Flask 程序时,通常需要先创建一个应用实例进行应用初始化。 上述代码中,使用 Flask 类创建了一个应用实例 app。 __name__ 参数用于获取当前代码文件的文件名,作为应用实例的名称。 if __name__ == \\\'__main__\\\': app.run(debug=True) 用于启动服务器并运行应

    2024年01月20日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包