先上链接:https://chatgpt.com/share/682f352f-ad4c-8008-8634-2462045a20d7
微软至今在Windows系统上预装的Powershell都是5.x的传统版本,不是Core版本(比如7.0)。而这个老旧的版本,如果你的系统默认编码是GBK,也就是CP 936,那么如果你尝试执行UTF8编码(但是不带BOM)的包含中文的ps1脚本,你很可能会遇到报错和乱码。
这是因为老旧的Windows应用默认不识别UTF-8,而是优先使用系统的编码,除非脚本是带BOM的编码。
先说结论:唯一的方案就是所有ps1脚本都使用UTF-8 with BOM编码,而不是UTF-8编码。
使用
chcp 65001
的方法能改变终端的代码页,但是Powershell执行脚本依然不参考这个,无法识别为UTF8并执行。下面这个方法也试过了,没用:
$OutputEncoding = [System.Text.UTF8Encoding]::new($false) # With no BOM
[Console]::InputEncoding = [System.Text.UTF8Encoding]::new($false)
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)
$PSDefaultParameterValues['*:Encoding'] = 'utf8'上面两个结合使用也不行的。
据称,Core版默认使用UTF-8不带BOM的版本,但是没有任何一个Windows版本自带Core版,都需要自行安装。所以这里就很搞笑了,微软做了个非常强大的shell,名字也很强大,但是普通用户执行首先就要调整执行策略才能执行脚本。这还不算啥,后来优化了,更容易开启了。搞笑的是,一个UTF-8编码迟迟不能好好支持,就好像Win32 C API那UTF-16残缺的Unicode美。
Core版有多强大或是现代我不懂,我没接触过,因为我实在对Powershell印象非常差。与其折腾Powershell那半吊子的现代和规整,我不如折腾cmd,起码编码的事情非常好搞。