本文档描述了对FNVA项目中文字符编码乱码问题的修复方案。主要解决Windows PowerShell环境下中文显示乱码的问题。
FNVA项目是一个跨平台环境切换工具,在Windows PowerShell环境下存在以下编码问题:
- PowerShell控制台编码冲突:Windows默认使用GBK/CP936编码,而Node.js和Rust使用UTF-8编码
- 临时脚本文件编码问题:生成的PowerShell脚本文件缺乏正确的编码标识
- 进程间编码传递问题:Rust程序输出到Node.js再到PowerShell过程中的编码转换问题
位置:
bin/fnva.js- Node.js包装器src/infrastructure/shell/script_strategy.rs- Rust核心代码
修复内容: 在所有生成的PowerShell脚本开头添加编码设置:
# 设置UTF-8编码以正确显示中文
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Console]::OutputEncoding位置:lib/encoding-utils.js
修复内容: 创建编码处理工具模块,为Windows环境下的PowerShell文件添加UTF-8 BOM标记:
const content = process.platform === 'win32' ? '\ufeff' + script : script;位置:lib/encoding-utils.js
修复内容: 在Node.js启动时自动设置Windows控制台编码:
execSync('chcp 65001 > nul 2>&1', { stdio: 'ignore' });-
bin/fnva.js- 引入编码工具模块
- 修复
generateSimpleScript函数 - 修复
createTempScriptFile函数 - 添加控制台编码设置调用
-
lib/encoding-utils.js(新增)- 编码处理工具类
- BOM标记添加功能
- 控制台编码设置
- 系统编码检测
src/infrastructure/shell/script_strategy.rs- 在PowerShell模板中添加编码设置
- 修复
POWERSHELL_JAVA_SWITCH_TEMPLATE - 修复
POWERSHELL_CC_SWITCH_TEMPLATE - 修复
POWERSHELL_MAVEN_SWITCH_TEMPLATE
- 新增PowerShell脚本时:必须在脚本开头包含编码设置代码
- 文件写入操作:使用
EncodingUtils.writeFileWithEncoding()替代直接的fs.writeFileSync() - 临时脚本生成:使用
EncodingUtils.createTempPowerShellScript()确保正确的编码处理
- Windows PowerShell用户:修复后的脚本将自动设置正确的编码,中文显示应该正常
- 其他系统用户:修复不影响其他系统的正常使用
- 故障排除:如果仍然遇到乱码,请检查PowerShell版本和系统编码设置
- UTF-8 BOM:帮助Windows正确识别UTF-8编码的文件
- PowerShell编码设置:
[Console]::OutputEncoding:设置控制台输出编码$OutputEncoding:设置PowerShell管道输出编码
- 控制台编码切换:使用
chcp 65001切换到UTF-8代码页
- 向后兼容:修复不影响现有功能的正常使用
- 跨平台支持:编码设置仅在Windows平台生效
- 错误处理:编码设置失败不会影响主要功能
-
Windows PowerShell环境:
fnva java use <version> fnva cc use <config> fnva maven use <version>
-
PowerShell ISE:测试在PowerShell ISE中的显示效果
-
Windows Terminal:测试在现代终端中的显示效果
-
其他系统:确保修复不破坏macOS和Linux的功能
- 中文显示检查:确保所有中文字符正常显示
- emoji显示检查:确保emoji图标正常显示
- 功能完整性:确保环境切换功能正常工作
- 代码审查:新增代码需要遵循编码处理规范
- 测试覆盖:定期在不同环境中测试编码效果
- 文档更新:如需修改,请更新此文档