Windows PowerShell 输出重定向 (“>”) 文件编码默认为UTF-16(LE)问题
问题描述:这两天在使用shp2pgsql时发现Windows PowerShell(为使行文方便,以下使用WPS替代Windows PowerShell,下不赘述)对于文件的输出重定向默认选择”UTF-16 (LE)”(微软称之为Unicode编码),而实际需要文件输出格式为”UTF-8”。
注意到此时本机上的msys2和bash都可将同一条语句的执行结果输出重定向为”UTF-8”编码文件,因此要从WPS本身着手解决这一问题。
在正式开始描述解决方案前,给出本机的相关环境:
- 1.Windows 版本:10.0.16299.248
- 2.WPS 版本:5.1.16299.248
注:WPS中查看WPS版本号的方式是键入:
$PSVersionTable
如果说你想一劳永逸的解决这个问题,那么最好是直接设置WPS的默认输出文件的编码格式(这是由于在版本号高于5.0的WPS中,输出重定向符号”>”实际上是操作“Out-File”的别名),则应在WPS中执行:
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
如果你还有兴趣往下看,那么我提醒大家注意WPS和cmd中的一点区别:
- 在cmd中,我们常用chcp 65001来切换当前命令行窗口工作编码格式为”UTF-8”,并且经过我的测试,发现这种改变也会作用到当前命令行窗口的输出重定向文件编码格式(由于cmd默认采用本地编码,那么在国内windows机器上大部分时候默认工作编码将会是gbk,如果你想要永久更改cmd窗口的工作编码为”UTF-8”,那么应当从注册表着手,你可以亲自动手搜索相关的教程)。
- 但如果你在WPS中继续应用chcp 65001语句改变编码后,你会发现这将无法作用到你当前WPS窗口的输出重定向文件编码格式(换言之,编码格式还是UTF-16)。
如果你只是偶尔而不是经常用到”UTF-8”格式文件,那么一个更明智的选择是在输出重定向时手动指定文件的编码格式而不是更改WPS中的默认输出文件编码格式。
以一个例子为例,假如你想在保持WPS默认输出文件编码为”UTF-16”将某一个命名的结果输出重定向到为”UTF-8”,那么你需要采用这样的命令:
<your command> | out-file 1.txt -encoding utf8