关键词 :
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
💡 预防建议
-
统一使用 UTF-8 编码
确保你的编辑器(VS Code、Sublime、Notepad++ 等)默认保存为 UTF-8,避免意外使用 UTF-16。
-
检查
.editorconfig
配置在项目中添加
.editorconfig
文件,明确指定编码:ini[*] charset = utf-8
-
避免从 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
📚 延伸阅读
遇到类似问题?欢迎在评论区留言交流!别忘了点赞、收藏,帮助更多开发者避开这个"编码陷阱"🚀