如果我运行这样的命令:
Write-Output March > a.txt
我得到这个结果:
U+FEFF
M U+004D
a U+0061
r U+0072
c U+0063
h U+0068
U+000D
\n U+000A
我不想要BOM。我尝试了不同的操作,如下所示:
$OutputEncoding = [System.Text.UTF8Encoding]::new($false)
$PSDefaultParameterValues['*:Encoding'] = 'utf8'
[Console]::InputEncoding = [System.Text.UTF8Encoding]::new($false)
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)
但它们似乎都没有解决这个问题。注意我正在使用PowerShell 5. 1。我确实看到了一些类似的问题,但与此不完全相同,因为它们是在处理管道和外部命令。
2条答案
按热度按时间ac1kyiln1#
TL;医生
>
运算符和Out-File
等cmdlet输出 * 无BOM * UTF-8,唯一的选择是更改为该编码 * 系统范围 *(请参阅下一节中的警告):intl.cpl
打开控制面板的区域设置,切换到Administrative
选项卡,单击Change system locale...
按钮并选中Beta: Use Unicode UTF-8 for worldwide language support
。需要重新启动。$PROFILE
文件完成:$PSDefaultParameterValues['*:Encoding'] = 'Default'
New-Item
的替代方案)。从Windows 10开始,您可以将Windows PowerShell * 默认设置为无BOM的UTF-8 -假设您愿意更改为此编码 * 系统范围 :
*将系统区域设置(非Unicode程序的语言)更改为无BOM的UTF-8,如this answer中所述:
intl.cpl
打开控制面板的区域设置,切换到Administrative
选项卡,点击Change system locale...
按钮,勾选Beta: Use Unicode UTF-8 for worldwide language support
;请注意,您需要 * 管理员权限 * 来进行此更改,并且需要 * 重新启动 * 才能使更改生效。*注意事项:
65001
,即(无BOM)UTF-8,这**不仅影响 * 所有控制台窗口 ,而且影响 * 所有遗留(非Unicode)应用程序 ,包括GUI应用程序。$PROFILE
**文件中(在PowerShell(Core)v6+中不需要):$PSDefaultParameterValues['*:Encoding'] = 'Default'
$OutputEncoding = [System.Text.Utf8Encoding]::new($false)
这样做的结果是:
-Encoding
参数的文件写入[1] Windows PowerShell cmdlet将默认为无BOM-less UTF-8(Default
表示活动ANSI代码页,然后将是65001
,即无BOM-less UTF-8)-特别是包括>
/Out-File
/Set-Content
。Get-Content
;通常,Windows PowerShell基于 * 系统区域设置适当的ANSI* 代码页解释无BOM文件(而PowerShell(Core)v6+假定为UTF-8)。chcp.com
报告65001
所反映的),PowerShell也将使用无BOM的UTF-8:$OutputEncoding
赋值还确保PowerShell将数据作为无BOM的UTF-8发送给外部程序。(幸运的是,这个首选项变量现在在PowerShell [Core] v6+中默认为无BOM的UTF-8。)请注意,上述内容还使所有 PowerShell [Core] v6+ 控制台窗口在所有方面都使用无BOM的UTF-8,除了您不需要
$PROFILE
添加(尽管它们没有害处)。背景资料:
> a.txt
实际上与| Out-File a.txt
相同。Windows PowerShell的
>
/>>
/Out-File
* 默认为UTF-16 LE(“Unicode”)[2],它总是使用BOM。Out-File
* 并使用其-Encoding
参数。$PSDefaultParameterValues
首选项变量设置>
/>>
/Out-File
的默认编码,如this answer中所述。***但是,在 Windows PowerShell 中,
-Encoding
的utf8
值 * 始终 * 是带有BOM***的UTF-8编码 *,因此-除非您愿意切换到UTF-8 * 系统范围 *,如上所述-创建 * 无BOM * UTF-8文件的唯一方法是 * 直接使用.NET API *。-Encoding
参数所接受的utf8
值现在(更明智地)引用 BOM-less UTF-8编码;如果您确实需要UTF-8 BOM,请使用utf8BOM
。至于你所尝试的:
*您尝试的属性和变量仅与PowerShell(在两个版本中)与外部程序 * 通信的方式有关 :
$OutputEncoding
确定PowerShell通过管道 * 向外部程序 * 发送数据时使用的编码(后者可以通过stdin(标准输入)读取)。[Console]::OutputEncoding
确定PowerShell在解释 * 从外部程序 * 接收的输出时使用的编码。[Console]::InputEncoding
是PowerShell在 it 从外部 * 接收数据 * 时使用的编码,当调用其CLI时。警告:在这种情况下,您不能从PowerShell会话中更改此编码,因为那将为时已晚。
它必须由 * 调用者 * 在 * 调用PowerShell CLI之前设置,从
cmd.exe
调用PowerShell CLI最容易使用chcp 65001
完成(请参见下面关于从 * 内部 * PowerShell调用chcp
的警告)。虽然这总是同时设置 *[Console]::InputEncoding
和[Console]::OutputEncoding
,但这通常是可取的。注意事项:
[Console]::OutputEncoding
和[Console]::InputEncoding
反映旧系统区域设置的OEM代码页的编码,如chcp.com
所报告的;在类Unix平台(PowerShell [Core] v6+)上,它是(现在几乎无一例外)(无BOM)UTF-8chcp.com
来更改这些属性-而是直接分配所需的编码。[1]从技术上讲,此首选项也适用于file-* 阅读 * cmdlet,这对于无BOM的文件来说不是绝对必要的,对于 * 具有 * BOM的文件也没有任何危害-即使该BOM指示UTF-16或UTF-32编码-因为BOM总是覆盖
-Encoding
参数。[2]不幸的是,在Windows PowerShell中,默认编码在cmdlet中变化很大-请参阅this answer的底部部分。
odopli942#
如果你只使用ascii字符,在powershell5.1中set-content就可以了:
或者在你的$profile中使用这个哈希表将out-file的默认编码设置为ascii。out-file的默认编码是utf 16或'unicode'编码。'〉'是out-file的快捷方式。键的名称必须用引号括起来,因为它包含冒号。utf8 nobom直到以后的powershell版本才可用。'〉〉'也会调用out-file,并且可能会在同一个文件中混合编码。
这将创建一个ascii文件: