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

📚 延伸阅读


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

相关推荐
崔庆才丨静觅19 分钟前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60611 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了1 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅1 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅2 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅2 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment2 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅2 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊2 小时前
jwt介绍
前端
爱敲代码的小鱼2 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax