cuiliang / Quicker

Quicker软件反馈repo

Home Page:https://getquicker.net

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

选择文件编码时,新增“UTF-8(BOM)”选项

ilcpm opened this issue · comments

问题是从“运行脚本”功能来的

Windows自带的PowerShell版本是5,对应的运行命令是powershell,默认.ps1脚本编码为ANSI
安装PowerShell 7之后,对应的运行命令为pwsh,默认.ps1的脚本编码为utf-8

安装PowerShell 7之后,quicker调用执行.ps1脚本的终端为PowerShell 7(pwsh),故在使用“系统默认编码”时会出现乱码
详见下图
image

( 补充一下,终端里的活动代码页就是中文环境对应的936,并非UTF-8对应的65001)
image


所以,我不建议使用ANSI这种不严谨的格式来作为脚本的编码,
对于PowerShell,带BOM头的UTF-8可以被完美的支持
对于cmd,手动在bat文件之前加上chcp 65001也可以解决问题(该方案对于.ps1文件无效)

image

所以希望能够在文件编码的列表里增加UTF-8(BOM)选项,避免PowerShell的编码问题
个人使用的时候手动调整一下就好了,但是在共享给别人或者使用别人共享的动作时,这个问题可能会带来很严重的后果,比如用PowerShell写的批量重命名文件功能……一旦出错后悔药都没有

另外GB2312应该不能用来代表中文的默认编码,根据我之前了解到的信息,2312所在的年代简体字标准都还没完全确定下来,比如“瞭望塔”的“瞭”字里面是没有收录的,那个时候写的是“了望”,下图是仿宋GB2312的所有“liao”的读音下的文字

image

从维基百科看,微软的2312似乎是个GBK的子集?所以正常在Windows里“瞭”这个字还是能打出来
https://zh.wikipedia.org/zh-cn/GB_2312#%E4%B8%A4%E7%A7%8D%E4%B8%8D%E5%90%8C%E7%9A%84GB/T_2312%E5%AE%9E%E7%8E%B0

然后中文现在最全的编码应该是GB18030,至于Windows默认用的到底是GBK还是18030具体没去深究

image
这是按照上面维基百科的提示,在Python里用2312编码“瞭”字的结果,确实2312是没有这个字,由此可以判断Windows下的2312是被微软用GBK扩增过的
在chcp 936的环境下是可以打出“瞭”的


补充,Windows下,在VSC中选择编码GB2312保存,得到的文件实际上是CP936,也就是ANSI
在记事本中保存默认编码也是ANSI对应CP936
二者都不是GB 2312,也就是说,Windows上似乎没有提供直接的方案来以严格的GB 2312存储文本?
所以就算要代表默认的Windows平台中文编码,也应该使用CP936而不是GB 2312
关于CP936,详见下文

我查了一下,Windows的默认编码“CP936”既不是GB2312也不是GBK或者GB18030……
只能说CP936≈GBK
GBK中没有欧元符号“€”,Python里直接认为CP936=GBK,所以有了下面两个图(PowerShell 5、cmd、Python)

image
image

至于18030,让GPT举个例子随便一试就报错
image
image

这里测试,编码类型直接选utf8就没有乱码了,你那边仍然会有么?
image
image

我的意思是说,装了PowerShell 7之后,虽然换成utf8就解决问题了

但是把动作分享给别人,或者安装别人的动作的时候,如果里面有PowerShell脚本,那就还是可能出现乱码,因为你没办法预知对方电脑的PowerShell版本……

PowerShell 5,默认把ps1当做ANSI看待,PowerShell 7默认当做UTF8对待

所以最好的方案就是对PowerShell脚本使用UTF8(BOM)编码,这样两个版本的PowerShell都不会有问题

对应的我认为quicker的改进方案就是增加UTF8(BOM)做为文件编码

@ilcpm 懂了,我加一下,感谢~

@ilcpm 测试了一下,utf8编码默认就会带BOM了
验证方法: 运行脚本后,用everything搜索ps1文件,找到quicker-xxxx.ps1这个临时脚本文件,使用vscode等编辑器打开,可以看到文件编码格式。使用二进制方式打开可以看到标记字符
image

image

那也得改一下,换成utf8+bat的情况反倒会出问题了😂cmd运行bat的时候不认BOM头

所以还是有必要分成UTF8和UTF8(BOM)两种文件编码

我个人推荐的最佳方案是PowerShell采用UTF8(BOM),bat采用UTF8然后第一行写上CHCP 65001,这样可以获得最好的通用性

cmd直接选默认编码就行了,powershell就选utf8编码,都不会出错了。
我在win11上测试,cmd文件不支持utf8编码,无论是否BOM。
在使用chcp 65001后,是否带BOM的UTF8,都可以正常显示。这时候如果要从quicker里读取内容,控制台编码参数也要选utf8.
image

是的,cmd那边带上chcp 65001就可以用utf8了,至于bom头的问题我不清楚win10win11是否有区别

但总之,我的想法就是说在“文件编码”的选项里区分开utf8和utf8(bom),细化成这两个,这样大家都可以根据自己的情况选择到合适的编码了,并且可以极大的提高对不同系统环境的适应性

目前测试的情况,对于现有的这些脚本类型,使用不使用BOM效果都一样,增加额外的选项反而会造成一定的疑惑。感觉还是不加为好。

win10这边bom对bat文件是有问题的,
image

你测试的图里,选的好像不是bat文件吧,你选的应该是“CMD命令”,看意思应该是类似于在控制台里实时输入命令运行,所以BOM头对这里没有影响,因为这就不是脚本文件

这样试试
image

目前测试的情况,对于现有的这些脚本类型,使用不使用BOM效果都一样,增加额外的选项反而会造成一定的疑惑。感觉还是不加为好。

我觉得还是需要加上的,就算PowerShell和cmd的问题解决了,对于“自定义脚本”来说,也是未知的,有的软件可以处理bom头,有的软件用utf8就不支持bom头,所以要么就写清楚这是有bom头的,要么就做成两个选项

用的.cmd脚本,和.bat脚本类似。bat更老一些。
image

自定义的脚本类型确实有可能遇到,我等增加一个了。