解决 null byte is not allowed in input:PNPM/npm 下载报错的编码陷阱

关键词null bytepnpm-workspace.yamlUTF-16Get-ContentSet-Contentpnpm installNode.jspackage.json

在使用 PNPM 或 npm 进行依赖安装时,你是否曾遇到过如下令人困惑的错误?

csharp 复制代码
ERROR Unexpected token "" (0xFFFD) in JSON at position 0...
null byte is not allowed in input

这类错误往往让人一头雾水,尤其是当你确认 package.json 内容看似"正常"时。但问题的根源,可能并不在内容本身,而在于文件的编码格式


❓ 问题背景

当你执行 pnpm installpnpm add 时,PNPM 会读取项目根目录下的 pnpm-workspace.yaml 文件(用于配置工作区)。如果该文件被保存为 UTF-16 编码(尤其是带 BOM 的 UTF-16 LE),Node.js 的 JSON 解析器会将其误读为包含"空字节(null byte)"的非法输入,从而抛出:

csharp 复制代码
null byte is not allowed in input

这是因为 UTF-16 编码中,每个字符由两个字节表示,ASCII 字符如 { 会被编码为 0x00 0x7B,其中的 0x00 被解析器视为"空字节",从而触发安全限制。


🔍 诊断:确认文件编码

我们可以通过 PowerShell 快速检查 pnpm-workspace.yaml 的原始字节流,判断其是否为 UTF-16。

步骤 1:查看文件前 16 个字节

powershell 复制代码
Get-Content .\pnpm-workspace.yaml -Encoding Byte -TotalCount 16 | Format-Hex

输出示例(UTF-16 LE):

复制代码
00000000  00 2D 00 2D 00 0A 00 20  00 20 00 20 00 20 00 70  |.-.-... . . . .p|

如果你看到字节以 00 交替出现(如 00 2D00 7B),说明文件是 UTF-16 编码,这就是问题的根源!


✅ 修复:统一转换为 UTF-8

解决方法是将文件内容以 UTF-8 编码重新写入。注意:我们不改变内容,只改变编码格式。

步骤 2:读取原始内容并以 UTF-8 重写

powershell 复制代码
$raw = Get-Content .\pnpm-workspace.yaml -Raw
Set-Content .\pnpm-workspace.yaml -Value $raw -Encoding utf8

📝 -Raw 参数确保一次性读取完整文本,保留换行符;-Encoding utf8 强制以 UTF-8 保存。


步骤 3:验证并重新安装

bash 复制代码
pnpm install

此时,错误应已消失。你可以继续执行依赖安装:

bash 复制代码
pnpm add fastify @fastify/cors @fastify/cookie @fastify/websocket @fastify/helmet @fastify/rate-limit

💡 预防建议

  1. 统一使用 UTF-8 编码

    确保你的编辑器(VS Code、Sublime、Notepad++ 等)默认保存为 UTF-8,避免意外使用 UTF-16。

  2. 检查 .editorconfig 配置

    在项目中添加 .editorconfig 文件,明确指定编码:

    ini 复制代码
    [*]
    charset = utf-8
  3. 避免从 Word 或富文本复制配置

    从文档、网页复制 YAML/JSON 时,容易携带隐藏字符或错误编码。建议使用纯文本编辑器中转。


✅ 总结

问题 原因 解决方案
null byte is not allowed in input pnpm-workspace.yaml 被保存为 UTF-16 编码 使用 PowerShell 转换为 UTF-8 编码

🧰 核心命令回顾:

powershell 复制代码
# 诊断
Get-Content .\pnpm-workspace.yaml -Encoding Byte -TotalCount 16 | Format-Hex

# 修复
$raw = Get-Content .\pnpm-workspace.yaml -Raw
Set-Content .\pnpm-workspace.yaml -Value $raw -Encoding utf8

# 重试
pnpm install

📚 延伸阅读


遇到类似问题?欢迎在评论区留言交流!别忘了点赞、收藏,帮助更多开发者避开这个"编码陷阱"🚀

相关推荐
薛定谔的算法6 小时前
低代码编辑器项目设计与实现:以JSON为核心的数据驱动架构
前端·react.js·前端框架
Hilaku7 小时前
都2025年了,我们还有必要为了兼容性,去写那么多polyfill吗?
前端·javascript·css
yangcode7 小时前
iOS 苹果内购 Storekit 2
前端
LuckySusu7 小时前
【js篇】JavaScript 原型修改 vs 重写:深入理解 constructor的指向问题
前端·javascript
LuckySusu7 小时前
【js篇】如何准确获取对象自身的属性?hasOwnProperty深度解析
前端·javascript
LuckySusu7 小时前
【js篇】深入理解 JavaScript 作用域与作用域链
前端·javascript
LuckySusu7 小时前
【js篇】call() 与 apply()深度对比
前端·javascript
LuckySusu7 小时前
【js篇】addEventListener()方法的参数和使用
前端·javascript
该用户已不存在7 小时前
6个值得收藏的.NET ORM 框架
前端·后端·.net
LuckySusu7 小时前
【js篇】深入理解 JavaScript 原型与原型链
前端·javascript