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

关键词 :null byte、pnpm-workspace.yaml、UTF-16、Get-Content、Set-Content、pnpm install、Node.js、package.json

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

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

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


❓ 问题背景

当你执行 pnpm install 或 pnpm 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 2D、00 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

📚 延伸阅读


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

相关推荐
漫步人生走在路上15 小时前
外贸B2B行业GEO优化白皮书:从0到1完整落地流程
前端·人工智能·搜索引擎·chatgpt·twitter
程序猿乐锅15 小时前
面向对象练习:图书借阅系统里的封装、抽象类与多态
开发语言·前端·数据库·后端·python·学习·1024程序员节
老木避暑研究所15 小时前
负氧离子数据的采集、清洗与可视化:一套可复用的环境监测数据分析模板
前端·人工智能·数据分析
计算机魔术师15 小时前
AI 推翻了一个当了30年地基的假设,查的人恰好是立论者
前端
范同学~16 小时前
项目添加水印
java·前端·javascript
鬼手点金16 小时前
缓存作为架构约束
开发语言·前端·人工智能·python·microsoft·缓存·架构
月夏16 小时前
前端第一次接自己的后端:mock 切真接口踩了 2 个坑,组件只改了一行 import
前端·后端·node.js
IT_陈寒16 小时前
React实战技巧总结:如何优雅处理复杂列表的渲染卡顿问题?
前端·人工智能·后端
ZoeLandia16 小时前
React11:数据请求与 TanStack Query
前端·react.js·typescript·react
前端架构师-老李16 小时前
HTML与CSS基础第二课—初识HTML
前端·css·html