解决 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

📚 延伸阅读


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

相关推荐
J2虾虾6 小时前
关于Ant Design Vue
前端·javascript·vue.js
程序员笨鸟6 小时前
[特殊字符] React 高频 useEffect 导致页面崩溃的真实案例:从根因排查到彻底优化
前端·javascript·学习·react.js·面试·前端框架
Highcharts.js6 小时前
从旧版到新版:Highcharts for React 迁移全攻略 + 开发者必知的 5 大坑
前端·react.js·前端框架·编辑器·highcharts
独角鲸网络安全实验室6 小时前
高危预警!React核心组件曝CVSS 9.8漏洞,数百万开发者面临远程代码执行风险
运维·前端·react.js·网络安全·企业安全·漏洞·cve-2025-11953
西瓜凉了半个夏~6 小时前
React专题:react,redux以及react-redux常见一些面试题
前端·javascript·react.js
大模型教程.6 小时前
收藏级教程:ReAct模式详解,让大模型从回答问题到解决问题
前端·人工智能·机器学习·前端框架·大模型·产品经理·react
独角鲸网络安全实验室6 小时前
高危预警!React CVE-2025-55182 突破 RSC 防护,未授权 RCE 威胁 39% 云应用
前端·react.js·网络安全·前端框架·漏洞·rce·cve-2025-55182
GISer_Jing6 小时前
前端开发:提示词驱动的全链路
前端·javascript·aigc
辛-夷6 小时前
TS封装axios
前端·vue.js·typescript·vue·axios
Swift社区6 小时前
Vue Router 越写越乱,如何架构设计?
前端·javascript·vue.js