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

📚 延伸阅读


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

相关推荐
卡卡罗特学AI5 小时前
AI 会话太多总记混,我干脆写了个菜单栏插件
程序员
禁止摆烂_才浅5 小时前
JavaScript 类型判断:instanceof 与 constructor 原理深度解析
前端·javascript·面试
gezg5 小时前
DeepSeek Harness 插件:Excel 拖进输入框,AI 自己去读文件
前端·ai编程
Asize5 小时前
HTTP 明明无状态,登录态怎么就保住了——React + Zustand + JWT 鉴权全流程拆解
前端·javascript
两只羊ovo5 小时前
MCP:AI 界的 USB-C,把模型和世界「插」起来
前端
Darling噜啦啦5 小时前
JWT 登录鉴权全链路:从 Zustand 状态管理到 Axios 拦截器,彻底搞懂前端鉴权工程
前端
PC2005_cloud5 小时前
Go学习笔记:错误处理——没有异常,只有 error
程序员
可涵不会debug5 小时前
LangChain 示例选择器(Example selectors)完整基础概念解读
服务器·前端·数据库
Csvn5 小时前
😱 React `<StrictMode>`:为什么 useEffect 被调用了两次?别慌,这是特性不是 bug
前端
Asize5 小时前
2 道大厂面试题:TS 工具类型我懂了,CSS 3 列布局把我问住了
前端·css·typescript