Notepad++ 乱码的正确处理顺序只有两步:先用「编码 → 以 UTF-8 格式编码」换一种解读方式(这一步不动文件字节,随时可以撤销),确认中文显示恢复正常后,再用「编码 → 转为 UTF-8」真正重写字节并保存。顺序反了——在识别还是错的状态下直接点「转为」——乱码会被永久写进文件,原来的字节就找不回来了。

网上流传的很多乱码教程,第一步就让你点「转为 UTF-8」。这是整篇文章我最想纠正的一件事,下面第二章会把它讲透。

如果你现在正对着一个乱码文件,先花 30 秒做这个最小动作(它不会损坏任何东西):

  1. 别按 Ctrl+S,别编辑,什么都别动。
  2. 看窗口右下角状态栏,那里显示着 Notepad++ 对当前文件编码的猜测。
  3. 点「编码」菜单,找上半部分的「以 UTF-8 格式编码」,点一下。
  4. 中文恢复正常了吗?没有就继续试「编码 → 字符集 → 中文 → GB18030」。

整段操作只改变 Notepad++ 的解读方式,磁盘上的文件一个字节都没变。你可以反复试,试错成本是零。

以下排查步骤以 Notepad++ 中文版 8.x 为准,不同小版本的菜单措辞可能略有出入(比如老版本写 UCS-2、新版本写 UTF-16),我会把差异点标出来。如果你对基础操作本身还不熟,建议先翻一遍 Notepad++ 入门教程。

本文分三部分,可以跳着看:

  • 第一部分:乱码与编码(含招牌的两步救回法、BOM 取舍、行尾符)
  • 第二部分:大文件卡死与性能优化
  • 第三部分:远程编辑服务器文件(NppFTP 配置与排错)

后面两部分的几个故障会回指到第一部分,它们看着是三件事,底下是同一套逻辑。

关键要点

  • 「以…格式编码」和「转为…」是编码菜单里两个不同的菜单项,前者只换解读方式不动字节,后者重写字节。救乱码必须先用前者,确认可读后再用后者。
  • 识别错误时直接点「转为」,会把乱码永久固化成文件内容,原字节被覆盖,文件救不回来。这是网上乱码教程里最普遍的一个错误建议。
  • 试编码的推荐顺序是 GB18030 → GBK → GB2312 → UTF-8 → UTF-8-BOM → UTF-16。中文 Windows 下的老文件绝大多数是 GBK 系,先试 GB18030 命中率最高。
  • BOM 不是"加了更保险":Python / Shell / PHP / JSON 一律不要 BOM;只有 Excel 直接打开 CSV 这类场景才需要它。
  • 大文件卡死的主因是自动换行、语法高亮和代码折叠,关掉这三个通常就够了。据第三方实测(样本与硬件条件未知,建议结合自身环境判断),1.2GB 的 access.log 关闭自动换行后打开时间从 45 秒降到 3 秒内。
  • 远程编辑改完的脚本在 Linux 上跑不起来,八成是行尾符问题;远程文件中文乱码,用的还是第一部分那套两步法。

第一部分:乱码与编码(第一至六章) 这一部分是全文的基础,后面两部分遇到中文乱码和换行符问题时都会回指到这里。

一、乱码的三种长相,对应三种病因

这一段解决"我看到的乱码到底属于哪一类"。先分诊,再抓药。不同长相的乱码走的排查路径不一样。

1. 满屏问号或空心方块:编码完全对不上

表现:中文整个变成 ????? 或者一排□,英文和数字倒是好好的。

病因:文件的编码和你当前的解读方式八竿子打不着,而且目标字符集里根本没这个字,只能用替换字符顶上。这种情况反而是最容易救的,因为字节没丢,只是翻译错了。

2. "锟斤拷""烫烫烫":UTF-8 字节被当 GBK 读了

表现:中文变成一串有规律的、能读出音的怪字。最经典的是「锟斤拷」。

这两个词不是段子,是有明确技术成因的:

  • 锟斤拷:UTF-8 的替换字符 U+FFFD(字节 EF BF BD)被 GBK 解读的结果。GBK 里 EFBF 是"锟"、BDEF 是"斤"、BFBD 是"拷"。所以你看到"锟斤拷",说明文件经过了至少一次"UTF-8 → 错误替换 → GBK 解读"的折腾。
  • 烫烫烫:字节 CC CC 被 GBK 解读。GBK 里 CCCC 是"烫"。这串字节通常是 C/C++ 调试模式下未初始化的栈内存填充值,出现在从内存里 dump 出来的文本里。

看到这两种,文件的内容其实已经经历过一次损坏了,能不能救回来要看损坏到什么程度。第一步依然是换解读方式试。

3. 大部分正常,只有个别字或标点出问题

分两种子情况,处理方式完全不同:

  • 只有生僻字变成问号:字符集装不下。文件是 GB2312,但内容里有 GBK 才收的字(比如一些生僻姓氏用字),保存时就被替换成了 ?。这种情况救不回来——字节已经变成 ? 了,只能找回原始来源重新导出,并且这次选 GB18030 或 UTF-8。
  • 文件开头多出  或"锘":这是 UTF-8 的 BOM(字节 EF BB BF)被当成正文内容显示了。文件本身没坏,只是读它的程序不认 BOM,或者你当前的编码设置把 BOM 当成了普通字节。

乱码决策树

照着走一遍,不用猜:

打开文件看到乱码
│
├─ 第 0 步:什么都别存!不要按 Ctrl+S,不要动编辑区
│            (保存会把当前错误状态写回磁盘)
│
├─ 第 1 步:看右下角状态栏
│            它显示的是 Notepad++ 的"猜测",不是事实,别迷信
│
├─ 第 2 步:依次点「编码 → 以 XXX 格式编码」试,只看不动
│            顺序:GB18030 → GBK → GB2312 → UTF-8 → UTF-8-BOM → UTF-16
│            每次点完只看显示,不保存
│
├─ 第 3 步:中文恢复正常了吗?
│      是 ──→ 现在才点「编码 → 转为 UTF-8」,然后 Ctrl+S
│      否 ──→ 全部试完都不行 → 跳到下面「试完了还是乱码」一节
│
└─ 想重来怎么办?
   只要没保存,直接关掉文件重新打开就回到原点。
   或者再点一次别的编码继续试,不需要撤销。

二、永远不毁文件的两步法:先"解读",再"转换"

这一段是全文的核心。如果你只有两分钟,就看这一章。

原理:字节没变,是密码本选错了

先建立一个心智模型,后面所有操作都基于它。

同一个汉字,在不同编码下是不同的字节。以"中"为例:

编码 "中"的字节 占几个字节
UTF-8 E4 B8 AD 3 个
GBK / GB18030 D6 D0 2 个

磁盘上存的是一串字节,它不会告诉你自己是什么编码。你用 UTF-8 的密码本去读 GBK 的字节 D6 D0,它会努力给你翻译出一个字来(可能是"兄"或者别的什么);你用 GBK 的密码本去读 UTF-8 的字节 E4 B8 AD,它会把这三个字节拆成"涓"加别的什么。

字节没丢,只是翻译错了。 这就是乱码能救回来的根本原因。

编码菜单的两组菜单项

打开「编码」菜单,你会看到它被分隔线分成上下两组。这两组的区别是整个乱码问题的关键:

组别 典型菜单项 干了什么 字节变了吗
上半部分 以 UTF-8 格式编码、以 UTF-8-BOM 格式编码、以 ANSI 格式编码、以 UTF-16 LE/BE 格式编码 换一种编码重新解读现有字节 不动
下半部分 转为 UTF-8、转为 UTF-8-BOM、转为 ANSI、转为 UTF-16 LE/BE 把当前显示的内容重新编码写回 重写

英文版里这两组分别叫 "Encode in ..." 和 "Convert to ...",用户社区里的共识总结很精辟:Encode in 保留字节、改变显示的字符;Convert to 保留显示的字符、改变字节。

想对照原文确认的,可以看 Notepad++ 官方用户手册(英文)。

另外「编码 → 字符集」子菜单里还有更细的选项(中文 → GB2312 / GBK / GB18030、西欧、日文等),用来做更精确的尝试。

不同 Notepad++ 版本的条目名称会有出入(老版本把 UTF-16 写作 UCS-2),但"以…格式编码"在上、"转为…"在下这个结构是一致的。动手前先花五秒钟确认你点的是哪一组。

第一步:以 UTF-8 格式编码(只换解读,不碰文件)

操作:「编码 → 以 UTF-8 格式编码」

这一步做了什么:告诉 Notepad++ "请换 UTF-8 这个密码本,把现有字节重新翻译一遍"。

  • 磁盘上的文件:一个字节都没变。
  • 状态栏的编码显示会变成 UTF-8。
  • 屏幕上的字会立刻变,可能变好,也可能变得更糟。

这一步是零风险的。 试错了不用撤销,直接点下一个候选编码继续试;实在乱了,关掉文件重新打开(Ctrl+W 别保存),一切回到原点。

怎么判断试对了?看这四条:

  1. 中文是正常的汉字,不是"锟斤拷"也不是问号;
  2. 中英文标点各归各位(" 不是 “”);
  3. 翻到文件中段和末尾各抽查一处,有些文件前半段能读、后半段才露馅;
  4. 没有残留的方块或菱形问号。

没恢复?换下一个。推荐顺序见下一节。

第二步:转为 UTF-8(真正重写字节)

只有确认显示完全正常之后,才做这一步。

操作:「编码 → 转为 UTF-8」,然后 Ctrl+S 保存。

这一步做了什么:把 Notepad++ 当前内存里显示的那些字符,按 UTF-8 规则重新编码成一串新字节,写回文件。

  • 状态栏会显示 UTF-8;
  • 文件内容在磁盘层面被改写了;
  • 这一步是不可逆的(保存之后 Ctrl+Z 救不回来,除非你有备份)。

想转成不带 BOM 的版本,选「转为 UTF-8」;Notepad++ 的「转为 UTF-8-BOM」是单独一项,默认别选,原因见第三章。

⚠️ 顺序错了会发生什么

这是本章最该记住的部分。

假设你手上是一个 GBK 文件,Notepad++ 误判成了 UTF-8,屏幕上显示"锟斤拷铡拷"一堆怪字。这时候如果你点了「转为 UTF-8」:

  1. Notepad++ 会把内存里那堆错误的字符("锟斤拷"等)当成正确内容;
  2. 按 UTF-8 规则把它们编码成新字节;
  3. 写回磁盘,覆盖原来的 GBK 字节。

结果:磁盘上现在存的是"锟斤拷"这三个字的 UTF-8 编码。原始的 GBK 字节已经不存在了。 这时候你再怎么切编码都没用——文件里真的就是"锟斤拷"三个字,它没被翻译错,它就是内容本身。

一次误操作,文件从"读错了"变成"真的坏了"。而且因为显示看起来还是那堆乱码,很多人甚至意识不到是自己刚才那一下弄坏的,只会觉得"这文件本来就坏了"。

一句话记住:先看懂,再改写。看不懂就别转。

坦白说,这个坑在中文互联网的教程里非常普遍——相当一部分乱码教程通篇只提「转为 UTF-8」,通篇不提「以…格式编码」。我们在做这篇之前的检索里,五个结果里只有一个讲对了顺序。这也是为什么我把这一章写得这么啰嗦。

依次尝试的顺序

中文环境的推荐顺序:

顺序 试什么 为什么
1 GB18030 GBK 的超集,覆盖全部汉字(含生僻字)。中文 Windows 下的老文件绝大多数是 GBK 系,试它命中率最高
2 GBK 比 GB18030 窄一点,但不是超集时能确认是不是边缘字集问题
3 GB2312 更老的国标,只有常用字
4 UTF-8 现代文件、代码、日志的默认
5 UTF-8-BOM 如果文件开头有 ,试这个
6 UTF-16 LE / BE 少见,但 Windows 的某些导出(注册表 .reg、部分 SQL Server 导出)是这个

为什么把 GB18030 放第一个? 很多人第一反应是试 UTF-8,但中文 Windows 环境下你遇到的"老文件"——十年前的配置文件、老 ERP 导出的表、银行和政务系统的回单——绝大多数是 GBK 系。GB18030 是 GBK 的超集,试它一次就能覆盖 GBK 和 GB2312 的绝大部分情况,比从 UTF-8 开始试省两轮。

反过来,如果你的文件是从 GitHub clone 的代码、Linux 服务器上下载的日志,那从 UTF-8 开始试更合理。判断依据不是编码本身的优劣,是文件从哪来。

试完了还是乱码

六种编码全试过都不行,往下排查:

  1. 文件本来就是二进制的。 用 Notepad++ 打开 .dll、.xlsx、.pdf,看到的就是乱码,这不是编码问题,是文件类型不对。
  2. 文件在别处就已经损坏了。 比如经过一次错误的编码转换(见上一节),或者传输过程中被截断。找回原始来源。
  3. 内容混了多种编码。 一个文件里前半段 UTF-8、后半段 GBK,任何单一编码都救不了。这种情况只能分段处理:把能正常解读的部分复制出来单独存,剩下的另想办法。
  4. 真的只是 BOM 显示问题。 内容其实全对,只是开头多了三个字节。用「转为 UTF-8(无 BOM)」去掉即可。

三、编码全家桶:ANSI / GBK / UTF-8 / BOM / UTF-16 该怎么选

救回文件是一回事,平时该用哪种编码是另一回事。这一章把 ANSI、GBK、UTF-8、BOM 这些名词一次性说明白。

ANSI 在中文 Windows 下就是 GBK

Notepad++ 里的 "ANSI" 不是一种具体编码,它是"当前系统的默认代码页"。在简体中文 Windows 上,系统代码页是 936,也就是 GBK。

所以:

  • 你在国内 Windows 上看到的 ANSI = GBK;
  • 同一个文件拿到日文 Windows 上打开,ANSI 就变成了 Shift-JIS。

这就是为什么 ANSI 文件跨机器容易出事。 它依赖打开它的那台机器的区域设置,而这件事文件自己不会说。

GB2312 / GBK / GB18030 的包含关系

GB2312  ⊂  GBK  ⊂  GB18030
(约 7 千汉字)  (2 万多)  (全部汉字 + 少数民族文字)

选哪个?一律选 GB18030 或干脆转 UTF-8。 GB2312 已经装不下很多现代用字了(包括部分人名地名用字),新文件没有任何理由用它。

UTF-8 无 BOM 是现代默认选择

跨平台、跨语言、跨工具,UTF-8 都是最大公约数。Web、Linux、Python 3、Go、Rust、编辑器生态,默认都是它。

UTF-8 无 BOM 应该是你新建任何文件时的默认选项。

⭐ BOM 什么时候必须有,什么时候绝对不能有

BOM(Byte Order Mark)是文件开头几个用来标记编码的字节。UTF-8 的 BOM 是 EF BB BF。

Unicode 标准其实不推荐给 UTF-8 加 BOM(UTF-8 没有字节序问题),但 Windows 生态历史上依赖它来识别编码,于是就有了现在这摊事。

我的判断依据是这样的:

场景 要不要 BOM 原因
Python 脚本(.py) 绝对不要 有 BOM 时,部分 Python 3.x 版本会在 shebang 行(#!/usr/bin/env python)报语法错
Shell 脚本(.sh) 绝对不要 BOM 会被当成命令名的一部分,直接 command not found
PHP 绝对不要 BOM 会被当作输出内容提前发送,导致 header() / session_start() 报 "headers already sent"
JSON 绝对不要 严格的 JSON 解析器会把 BOM 当非法字符,报解析失败
被 include / import 的代码文件 绝对不要 理由同上,会引入看不见的前导字符
HTML / CSS / JS 不要(加了也能跑,但没必要) 现代浏览器都认 <meta charset="utf-8">
纯文本笔记、草稿 无所谓 怎么都行
Excel 直接双击打开的 CSV 需要 没有 BOM 时 Excel 会按系统 ANSI 打开,中文全乱
部分老旧 Windows 软件(老 ERP、老财务软件导入) 通常需要 它们只认带 BOM 的 UTF-8

一句话总结:代码和结构化数据一律不要 BOM;给 Windows 桌面软件(尤其 Excel)看的中文 CSV 需要 BOM。

关于 Python 那条我多说一句:具体哪些版本会报错、报什么错,不同环境表现不完全一致,我没有把它写死成某个版本号的意思。稳妥做法就是脚本文件一律无 BOM,这个结论不依赖版本。

怎么去掉已有的 BOM?「编码 → 转为 UTF-8」。怎么加上?「编码 → 转为 UTF-8-BOM」。

UTF-16 什么时候会碰到

日常很少,但有几个固定来源:

  • Windows 注册表导出的 .reg 文件;
  • SQL Server 的部分导出选项;
  • 某些老版本的 Windows 记事本另存时选了 "Unicode"。

特征:用 UTF-8 或 GBK 打开时,中文是乱码,但英文字符之间能看到规律性的空格(因为另一个字节是 \x00)。碰到这种情况,试「以 UTF-16 LE 格式编码」(小端,Windows 上最常见)。


四、一劳永逸:把默认编码设对

每次都手动救太累了。两个设置就能把大部分乱码挡在它发生之前。

默认新建编码

「设置 → 首选项 → 新建」:

  • 编码:选 UTF-8(无 BOM 的那个)
  • 默认语言:按需,一般不用动
  • 换行格式:见下一章

这管的是新建文件(Ctrl+N)的编码。已经存在的文件不受它影响。

默认换行格式

在同一个页面,或者「编辑 → 档案格式转换」里:

选项 换行字节 用在哪
Windows (CR LF) \r\n Windows 原生文件、.bat、多数前端项目
Unix (LF) \n Linux / macOS、Shell 脚本、Python 脚本、Git 仓库里的源码
Mac (CR) \r 2001 年之前的老 Mac,现在基本碰不到

选哪个看你的主要场景。如果你写的东西要往 Linux 服务器上放(脚本、配置、Dockerfile),选 Unix (LF)。

「以 UTF-8 格式打开所有文件」要不要勾

在「设置 → 首选项 → 新建」(部分版本在其他页签)里有一个选项,叫「以 UTF-8 格式打开所有文件」。利弊都很实在,我不替你拍板:

勾上的好处:现代文件——代码、日志、配置、Markdown——绝大多数是 UTF-8。勾上之后,Notepad++ 遇到编码不明的文件一律先按 UTF-8 解读,能砍掉大部分误判。

勾上的坏处:你偶尔要处理 GBK 老文件时,它也会一律按 UTF-8 解读,反而更容易乱。而且它只改变"默认猜测策略",不改变"自动检测"的能力——有些文件 Notepad++ 本来能猜对,勾了这个反而被强行拉到 UTF-8。

我的建议:

  • 你的文件八成以上是现代 UTF-8(程序员、运维、写作)→ 勾上;
  • 你经常要跟老系统打交道(银行、政务、老 ERP 导出的 GBK 文件)→ 别勾,保持自动检测。

这些设置项都写在配置文件里,改之前先备份一份是划算的习惯,具体怎么做见 配置文件备份怎么做。


五、行尾符:CRLF / LF / CR 与脚本执行失败

这一段跟乱码不是一回事,但它是"文件不听话"里最容易让人抓狂的一种,而且和第三部分的远程编辑强相关。

怎么看和怎么转

看:状态栏右侧会显示当前的行尾符类型(Windows / Unix / Mac)。也可以「视图 → 显示符号 → 显示行尾符」,让每一行末尾的 CRLF 或 LF 直接显示出来。

转:「编辑 → 档案格式转换 → 转成 Windows 格式 / 转成 UNIX 格式 / 转成 MAC 格式」。

状态栏上那个行尾符标识也可以直接点,双击就能切换,比走菜单快。

经典故障:^M: bad interpreter

在 Windows 上写好一个 Shell 脚本,上传到 Linux,chmod +x 之后执行,报:

/bin/bash^M: bad interpreter: No such file or directory

那个 ^M 就是 \r。Linux 内核读 shebang 行 #!/bin/bash\r,把回车符也当成了解释器路径的一部分,于是去找一个叫 /bin/bash\r 的程序,找不到。

解决办法:在 Notepad++ 里「编辑 → 档案格式转换 → 转成 UNIX 格式」,保存,重新上传。

反过来也有:在 Linux 上写的脚本拿到 Windows 的记事本里打开,所有行挤成一行,因为记事本认 \r\n,纯 \n 它不认。Notepad++ 没这个问题,但它会老实地把行尾符类型显示在状态栏上。

Git 的 core.autocrlf

如果你用 Git,还有一个额外的变量在起作用:

git config --global core.autocrlf true    # Windows:签出转 CRLF,提交转 LF
git config --global core.autocrlf input   # macOS/Linux:提交转 LF,签出不转换
git config --global core.autocrlf false   # 不自动转换

Windows 上通常设 true。它会在你 git add 的时候把 CRLF 转成 LF 存进仓库,签出时再转回来。

Notepad++ 和它的关系是:如果 Notepad++ 显示某个文件是 Unix (LF) 格式,但你在 Windows 上编辑保存后又变成了 CRLF,那可能是编辑器设置或 .gitattributes 在起作用,不是 Git 出了问题。排查的时候先确定"到底是哪一环改的":用「视图 → 显示符号 → 显示行尾符」看一下,比猜快。


六、显示不可见字符与插入特殊字符

有些问题肉眼看不见:行尾多了一个看不见的字符,脚本就废了。

显示不可见字符

「视图 → 显示符号」下面有三个常用项:

菜单项 显示什么 什么时候开
显示空格与制表符 空格显示为小点,Tab 显示为箭头 排查缩进混用(尤其 Python)
显示行尾符 行尾显示 CRLF / LF 排查换行符问题,见上一章
显示所有字符 上面两个加上其他控制字符 排查从别处粘贴来的诡异字符

缩进混用是这里最常见的用途。Python 项目里 Tab 和空格混着用,语法错误报在莫名其妙的行号上,一开"显示空格与制表符"立刻现行。

插入特殊字符

「编辑 → 字符面板」会打开一个 Unicode 字符表,可以按类别浏览插入。适合插入一些打不出来的符号(不间断空格、零宽空格、各种箭头和制表符)。

另一个更快的方法:按住 Alt,在小键盘上输入字符的十进制码位,松开 Alt 就插进去了。比如 Alt+0160 是不间断空格。注意必须是小键盘,主键盘上面那排数字键不行。



第二部分:大文件与性能(第七至十章) 这一部分解决"文件太大,打开就卡死"。核心思路是关掉那些强制全文扫描的功能。

七、为什么大文件会卡死:三个幕后元凶

这一段解决"为什么几百 MB 的日志能把我编辑器搞死"。知道了原因,优化手段就是顺理成章的。

Notepad++ 其实是有稀疏加载(sparse loading)机制的,它不会真的把 2GB 全读进内存。但下面这三样东西会强制它把整个文件过一遍,稀疏加载直接失效:

元凶一:自动换行(Word Wrap)

开了自动换行,编辑器要计算每一行在当前窗口宽度下从哪儿折行。这意味着它必须知道每一行的实际内容长度,等于把全文从头扫到尾。一个 1GB 的日志,扫描本身就要几十秒。

元凶二:语法高亮 + 代码折叠

高亮要为全文构建 token 映射表;折叠要构建括号和缩进的层级树。这两件事都是全文级别的,而且不是一次性——你滚动、编辑的时候它们要持续维护。

元凶三:可写模式的预扫描

以可编辑方式打开文件时,Notepad++ 要额外准备:撤销缓冲区、行起始位置索引表、以及内部的编码转换(它在内存里用 UTF-16 处理文本,所以 UTF-8 文件要整体转一遍)。

这一条解释了为什么"只读打开"会快那么多。

第三方实测数据(谨慎参考)

  • 据第三方实测(数据来自 php.cn 上一篇大文件处理的实测文章,样本与硬件条件未知,建议结合自身环境判断):1.2GB 的 Nginx access.log,关闭自动换行后打开时间从 45 秒降到 3 秒以内。
  • 另有分析指出:512MB 的文件在可写模式下,实际内存占用可能达到 2.1GB,而稀疏加载只在只读模式下真正生效。

这两个数字我都没法自己跑一遍验证,所以按"第三方实测"引用。但它们指向的结论跟我自己的体感是一致的:关掉自动换行是收益最大的一步,其次是用只读模式打开。


八、立刻见效的四步优化

先别管原理。按顺序做完这四步,大部分大文件就能打开了。

第 1 步:关掉自动换行

「视图 → 自动换行」,把勾去掉。

这一步收益最大。 上面那个 45 秒 → 3 秒的实测,主要就是它的功劳。代价是长行需要横向滚动,看日志时不太方便,但总比打不开强。

快捷键:Ctrl+Shift+W 可以快速切换(部分版本绑定可能不同)。

第 2 步:关掉语法高亮

「语言 → N → 无语法(Normal text)」。

把文件当成纯文本处理,不做任何 token 分析。看日志、看 CSV 的时候高亮本来也没什么用。

第 3 步:关掉代码折叠

「设置 → 首选项 → 编辑」,找到「折叠样式」(Fold style)下拉框,选「无」。

折叠要维护全文档的层级树,对大文件是纯负担。

第 4 步:用只读方式打开

这一步对 GB 级文件效果最明显,但操作稍微绕一点。两种方法:

# 方法一:命令行启动,-ro 参数
notepad++.exe -ro "D:\logs\access.log"

# 方法二:先把文件属性设成只读,再双击打开
# (资源管理器右键文件 → 属性 → 勾选"只读")

用只读方式打开时,标签页上会多一个锁形图标,编辑区不能修改。想编辑的话,把只读属性去掉重新打开即可。

为什么只读这么重要:可写模式下 Notepad++ 要做完整的预扫描(撤销缓冲、行索引、编码转换),内存占用可能是文件大小的数倍。只读模式跳过这些,走真正的稀疏加载。

顺带关掉的后台动作

「设置 → 首选项」里还有几个会拖后腿的,处理大文件时可以临时关掉:

  • 自动完成(首选项 → 自动完成):大文件里词表构建很慢;
  • 会话快照(首选项 → 备份):会在后台周期性保存会话;
  • 自动更新检查。

平时这些功能是有用的,只在处理超大文件时临时关一下就行。


九、大文件里的搜索与定位

这一段解决"文件好歹打开了,怎么找到我要的那几行"。

不要勾「标记所有匹配项」

这是大文件搜索最大的性能陷阱。「标记所有」会为每一处匹配创建视觉标记并加入内部列表。在 GB 级日志里搜一个常见关键词,匹配几万处,UI 线程会直接卡住,可能几十秒到几分钟不响应。

替代方案:

  • 用「查找下一个」(F3)逐处跳,想停就停;
  • 或者用「计数」先看有多少处,心里有数再决定下一步。

用书签 + Ctrl+G 代替滚动

  • Ctrl+G 输入行号直接跳转;
  • F2 / Shift+F2 在书签之间跳,Ctrl+F2 打书签;
  • 「编辑 → 开始/结束选择」可以框定一个行区间,配合 Ctrl+G 先跳到起点标记、再跳到终点标记,就能选中几千行做局部操作。

超大文件的切片思路

如果文件大到连上面这些都很费劲,那就别硬扛,先切片:

# Windows:用 PowerShell 取前 5000 行
Get-Content access.log -TotalCount 5000 > part1.log

# Windows:用 findstr 过滤出关心的行
findstr /C:"ERROR" access.log > errors.log

# Linux / WSL:取 1000 到 2000 行
sed -n '1000,2000p' access.log > slice.log

切出来的小文件丢进 Notepad++ 里精读、精改,比在 2GB 的原文件上硬操作舒服得多。这也是我处理日志的整体思路:检索 → 切片 → 精编 → 合并,每一步都用合适的工具。

说到批量处理,正则替换那一套(多文件查找、批量改写)在 多文件查找与批量替换 里有完整说明。但请注意顺序:先切片,再批处理。直接对 GB 级原文件跑「在文件中替换」,风险和时间成本都不划算。


十、进阶:启动参数、内存与替代方案

如果上面四步还不够,那就到了该问一句"是不是工具选错了"的时候。

启动参数

# 提高可用内存上限(单位 MB)
notepad++.exe -maxMem=2048 "D:\logs\access.log"

# 只读 + 跳到指定行
notepad++.exe -ro -n1500 "D:\logs\access.log"

-ro 只读、-n<行号> 打开后跳到指定行、-maxMem=<MB> 调整内存上限。这些是可以组合的。

64 位是处理大文件的前提

这一条是硬件层面的硬约束,绕不过去:32 位程序最多只能用到约 2GB 的用户态内存(默认配置下甚至更少)。不管你怎么优化设置,32 位的 Notepad++ 打 1.5GB 的日志就是在跟这个天花板较劲。32 位和 64 位的区别可以对照 Notepad++ 官网 的说明。

Notepad++ 中文版下载 页面提供 32 位和 64 位两个版本,日志分析、大文件处理这类场景请务必选 64 位。如果你不确定自己在用哪个,看「? → 关于」窗口,或者到 Notepad++ 64 位版本 页面确认。

临时禁用插件

插件也会拖慢大文件的打开。想确认是不是某个插件的锅,最快的办法:

  1. 找到 Notepad++ 的插件目录(安装版在 C:\Program Files\Notepad++\plugins,便携版在程序目录下的 plugins);
  2. 把它临时改名成 plugins_bak;
  3. 重启 Notepad++,再打开大文件试试。

这样不会删除任何东西,试完改回来就行。

⚠️ 纠偏:那些"大文件查看插件"的真相

这一段是专门用来给你避坑的。检索资料的时候我看到好几篇教程推荐所谓的大文件处理插件,其中有几个说法是不靠谱的:

  • TextFX:这个插件确实曾经很有名(它的排序、去重、大小写转换功能被写进过无数教程),但它已经长期没有维护,在 64 位 Notepad++ 上根本装不了。如果哪篇教程让你去装 TextFX 处理大文件,那篇教程至少是七八年前写的。它当年提供的行操作功能,Notepad++ 现在都内置在「编辑 → 行操作」里了,逐个对照见 Notepad++ 删除重复行与排序。
  • 一些叫不上名字的"大文件查看器插件":部分教程提到的插件名在实际的插件管理器里搜不到。我建议一个简单原则:先在「插件 → 插件管理」里搜一遍,搜不到就当它不存在。 不要去下载来历不明的 .dll 手动丢进 plugins 目录。

Notepad++ 处理大文件的正路就是上面那四步优化,插件帮不上太多忙。好处是这套方法不需要装任何东西。

什么时候该换工具

承认边界也是效率。下面这些情况,我建议直接换工具:

场景 建议
只是想看看日志尾部 tail -f(Linux / WSL)或 PowerShell 的 Get-Content -Wait
要统计、聚合、按条件过滤 grep / awk / findstr,或者专门的日志分析工具
文件超过 2GB 且需要日常反复处理 ELK、Loki 这类日志系统,或者先把日志按天轮转
需要多人协作分析 同上,别用文本编辑器硬扛

Notepad++ 的舒适区是中小文件的精修。偶尔处理一个大文件,上面的优化够用了;如果要天天处理,那说明你的工具链该升级了。



第三部分:远程编辑(第十一至十三章) 这一部分解决"文件不在本机"。这里的两个高频故障,根因都在第一部分。

十一、NppFTP:像编辑本地文件一样改服务器文件

这一段解决"文件在服务器上,我不想下载了改完再传回去"。

安装

「插件 → 插件管理」,搜 NppFTP,勾选安装,按提示重启。装完在「插件 → NppFTP」里可以调出面板,通常显示在右侧或左侧边栏。

如果插件管理器里搜不到(网络问题或者用的是精简版),可以从 NppFTP 的官方仓库 的 Releases 页面手动下载,把 NppFTP.dll 放进 plugins\NppFTP\ 目录,注意位数必须和你的 Notepad++ 一致(64 位 Notepad++ 用 64 位插件)。更多插件安装与避坑见 NppFTP 插件。

配置一个连接

在 NppFTP 面板点齿轮图标 → Profile settings → Add new,填这几项:

字段 填什么
Profile name 给它起个名字,比如"生产环境-web01"
Hostname 服务器 IP 或域名
Connection type 见下面的端口表
Port 见下面的端口表
Username 登录用户名
Password 密码(用密钥认证的话可以留空)
Initial remote directory 连接后默认进入的目录,比如 /var/www/html

端口与协议对照

协议 端口 说明
SFTP 22 基于 SSH,首选。加密,且复用你已有的 SSH 账号和密钥
FTP 21 明文传输,账号密码在网络上裸奔。只在内网可信环境用
FTPS(显式 / Explicit) 21 先连明文再升级到 TLS
FTPS(隐式 / Implicit) 990 一上来就 TLS。老式服务器常见

公网环境一律用 SFTP 或 FTPS。 明文 FTP 在这个年头没有任何借口可用。

密钥认证(比密码更值得配)

在 Profile settings 的 Authentication 页签:

  • 勾选 Try private key authentication;
  • 在下面的私钥文件路径里,选你的私钥(PuTTY 生成的 .ppk,或者 OpenSSH 格式的私钥,取决于服务器和 NppFTP 版本)。

配好之后连接时就不用输密码了,而且比密码安全得多:私钥文件可以设置密码保护,也不会在网络上传输。

首次连接的 host key 确认

第一次用 SFTP 连一台新服务器时,会弹出一个 host key 确认对话框,显示服务器的指纹。这是正常的,也是你应该看一眼的——它是防止中间人攻击的机制。

确认之后 Notepad++ 会记住这个 host key。如果哪天它突然又弹出来警告 host key 变了,别无脑点"是",先确认服务器是不是重装过或者 IP 被换掉了。

保存即上传

在 Profile settings 的 Transfers 页签里可以配置传输行为,其中一项是保存时自动上传。

这个开关我建议在生产环境关掉。 原因很简单:你在 Notepad++ 里随手按了个 Ctrl+S,生产环境的配置文件就改了。手滑改错一个字符,服务立刻挂掉,而你可能还没意识到自己保存过。

测试环境开着很方便,生产环境还是手动上传、上传前再看一眼 diff 更稳妥。


十二、远程编辑的正确姿势与安全底线

这一段讲几个用血泪换来的习惯。

离线优先(生产环境强烈建议)

流程应该是:

  1. 从服务器下载文件到本地(NppFTP 里双击打开会自动下载一份临时副本,或者你手动下载);
  2. 在本地改好、检查好;
  3. 确认无误后上传覆盖;
  4. 上传后在服务器上验证(nginx -t、php -l、或者浏览器访问)。

不要在线上边想边改。你在编辑器里试错的每一秒,生产环境的文件都处在一个中间状态。

生产和测试用不同配色区分

Notepad++ 本身不能按连接区分主题,但你可以做两件事降低误操作概率:

  • Profile 命名带上环境标识,比如 [PROD] web-01 和 [TEST] web-01,连之前看一眼;
  • 测试环境用「保存即上传」,生产环境关掉。这样"保存"这个动作的后果在两个环境里不一样,能强迫你多确认一步。

凭据管理

  • 公网环境不用明文 FTP(说过了,值得再说一遍);
  • 优先用密钥认证;
  • 定期更换密码;
  • 在 Profile settings 里可以设置超时自动断开,长时间不用就断掉;
  • 别在公共电脑上保存密码。 NppFTP 会记住你填的密码,这是方便也是风险。

多人同时编辑同一个文件

NppFTP 不做文件锁。两个人同时打开同一个配置文件,A 保存,B 再保存,A 的改动就没了,而且没有任何提示。

运维场景下的规矩:改之前先在群里说一声,改完也说一声。配置文件尤其要注意。


十三、远程编辑的六个常见故障

这一段是排错清单。其中第 4、5 两条会回指到第一部分,你会发现远程编辑的坑,其实还是编码和行尾符那两个。更多问答见 乱码与远程编辑的更多问答。

1. 连接超时 / 被拒绝

按顺序查:

检查项 怎么查
服务器 sshd 在跑吗 systemctl status sshd
端口对吗 SFTP 是 22,别填成 21
防火墙放行了吗 服务器本机 firewall-cmd --list-ports
云厂商安全组开了吗 去控制台看入站规则,这一步最容易被忘
服务器 IP 变了吗 弹性 IP 重新绑定后 host key 会警告

2. 权限被拒(能连上,但读不了 / 写不了)

文件权限和属主的问题:

ls -l /var/www/html/config.php    # 看权限和属主
id www-data                        # 看服务运行用户

常见情况:你用 root 连上去改了一个原本属于 www-data 的文件,改完属主变成了 root,Web 服务反而读不了了。改完记得 chown 回去。

3. 插件装不上

九成是位数不匹配:32 位的 Notepad++ 装不了 64 位的插件(反之也不行)。

看版本:「? → 关于」里会写是 32 位还是 64 位。装插件时选对应的版本。

4. 中文乱码 → 回接两步法

症状:本地打开远程文件,中文全是乱码;或者你在本地写好了中文,上传后服务器上显示的乱码。

原因:远程文件通常是 UTF-8,你本地 Notepad++ 的默认编码是 GBK(或者反过来)。

处理:用的就是本文第一部分那套,一步都不差:

  1. 「编码 → 以 UTF-8 格式编码」(先看,不动文件);
  2. 中文恢复正常后,再「编码 → 转为 UTF-8」;
  3. 保存、上传。

别跳第 1 步。 跳过它直接「转为」,就是把乱码永久固化的那个错误。远程文件尤其麻烦——你的本地可能还有副本,但服务器上的原文件如果你已经保存上传了,那就真没了。

完整的操作细节和尝试顺序,见上文 H2-2「永远不毁文件的两步法」(第一部分第二章)。

5. 换行符差异导致脚本执行失败 → 回接行尾符

症状:在 Windows 上用 Notepad++ 改好一个 Shell 脚本,上传到 Linux,chmod +x 之后执行报错:

/bin/bash^M: bad interpreter: No such file or directory

原因:文件是 CRLF 行尾,Linux 不认那个 \r。

处理:用上文 H2-5「行尾符」(第一部分第五章)里讲的方法——「编辑 → 档案格式转换 → 转成 UNIX 格式」,保存,重新上传。

更省事的做法:在做远程编辑之前,就把默认换行格式设成 Unix (LF)(「设置 → 首选项 → 新建 → 换行格式」)。如果你日常就是写要往 Linux 上放的东西,这个设置一次搞定,比每次转换强。

反过来也有:Windows 的 .bat 批处理文件如果被转成了 LF,某些情况下会执行异常。所以判断依据还是那句话:看文件最终在哪儿跑。

6. 大文件传输中断

通过 SFTP 传几百 MB 的文件,中途断了。

处理:

  • 在 Profile settings 的 Transfers 页签里把 Timeout 调大(默认可能是 20 或 60 秒,网络不好时不够用);
  • 大文件传输我建议别用编辑器。用 WinSCP、FileZilla 这类支持断点续传的客户端,Notepad++ 只负责"改"这一件事。传输中断后反复硬传,浪费的时间远超切换工具的成本;
  • 如果一定要用 NppFTP,先确认网络稳定,并且不要在传输过程中做别的操作。

结语:三个场景的统一排查心法

编码、大文件、远程编辑,看着是三件不相干的事,但它们有一个共同的排查顺序:

  1. 先确认不会更糟。 乱码了别保存,卡死了别强杀(先等一等,或者先关掉别的功能),要改生产文件先下载一份本地副本。
  2. 先看状态栏。 Notepad++ 的右下角同时告诉你编码、行尾符、文件类型、行列号。大部分问题的第一手线索都在那儿,而且是免费的。
  3. 分离"显示"和"内容"。 乱码是显示层的问题(字节没变),转换才是内容层的动作;行尾符是字节层面的差异,但在编辑器里可能完全看不出来。先搞清楚你改的是哪一层,再动手。

三步走完还解决不了,就该考虑是不是工具选错了。这不是认输,是省时间。

下一步

  • 想把默认编码、自动保存、备份目录这些一次性设对,并且换电脑时不丢配置 → 配置备份与迁移。
  • 需要批量改写文件内容(比如给一批 SQL 加语句、从日志里提取字段)→ 正则替换 15 个实例。

还想看更多 Notepad++ 教程?

回到教程总入口,5 篇长文专题一次看全,从入门到进阶都不绕路。

查看全部使用教程
使用教程