当前位置: 首页 > 知识库问答 >
问题:

将PowerShell的默认输出编码更改为UTF-8

松成和
2023-03-14

默认情况下,当您将命令的输出重定向到文件或通过管道将其导入PowerShell中的其他内容时,编码是UTF-16,这是不有用的。我想把它改成UTF-8。

可以通过将>foo.txt语法替换为out-file foo.txt-encoding utf8来逐个实现,但每次都要重复这样做会很尴尬。

在PowerShell中设置东西的持久方法是将它们放在\users\me\documents\windowsPowerShell\profile.ps1中;我已经验证了这个文件确实是在启动时执行的。

曾经说过,可以使用$psDefaultParameterValues=@{'out-file:encoding'='utf8'}设置输出编码,但我尝试过,没有效果。

https://blogs.msdn.microsoft.com/powershell/2006/12/11/outputencoding-to-the-reseconce/第一眼看上去好像应该是相关的,但随后它谈到了以ASCII编码的输出,而实际情况并非如此。

如何设置PowerShell使用UTF-8?

共有1个答案

融渊
2023-03-14

注意:以下内容适用于Windows PowerShell。
有关跨平台PowerShell Core(V6+)版,请参阅下一节。

>

  • 在PSV5.1或更高版本(其中>>实际上是out-file的别名)上,可以通过$PSDefaultParameterValues首选项变量为///out-file设置默认编码:

    • $psDefaultParameterValues[“out-file:encoding”]=“utf8”

    在PSV5.0或更低版本上,您不能更改>/>的编码,但在PSv3或更高版本上,上述技术可以用于对out-file的显式调用。
    $PSDefaultParameterValues首选项变量是在PSv3.0中引入的)。

    在PSV3.0或更高版本上,如果要为所有支持
    -encode参数(在PSV5.1+中包含>)的cmdlet设置默认编码,请使用:

    • $psDefaultParameterValues['*:Encoding']='utf8'

    如果将此命令放在$profile中,则out-fileset-content等cmdlet默认情况下将使用UTF-8编码,但请注意,这使其成为会话全局设置,将影响未通过其-encode参数显式指定编码的所有命令/脚本。

    同样,确保在您的脚本或模块中包含这样的命令,您希望以相同的方式运行,这样即使由另一个用户或不同的机器运行时,它们也确实表现相同;但是,要避免会话全局更改,请使用以下表单创建$PsDefaultParameterValues的本地副本:

    • $psDefaultParameterValues=@{“*:Encoding”=“utf8”}

    注意:从V5.1开始,PowerShell总是创建带有(伪)BOM的UTF-8文件,这只有在Windows世界中才是常见的--基于UNIX的实用程序不识别此BOM(参见底部);有关创建无BOM的UTF-8文件的变通方法,请参阅本文。

    有关许多Windows PowerShell标准cmdlet之间非常不一致的默认字符编码行为的摘要,请参阅底部部分。

    自动$outputencoding变量不相关,只适用于PowerShell如何与外部程序通信(PowerShell向其发送字符串时使用的编码)--它与输出重定向运算符和PowerShell cmdlet用于保存到文件的编码无关。

    PowerShell现在通过其PowerShell Core edition实现了跨平台化,其编码(合理地说)默认为无BOM的UTF-8,与类UNIX平台一致。

    如果您在类似UNIX的平台上使用编辑器创建PowerShell脚本,现在甚至在Windows上使用跨平台编辑器(如Visual Studio代码和Sublime Text),则生成的*.ps1文件通常不会有UTF-8伪BOM:

    • 这在PowerShell内核上运行良好。
    • 如果文件包含非ASCII字符,则在Windows PowerShell上可能会中断;如果您确实需要在脚本中使用非ASCII字符,请将它们保存为带BOM的UTF-8。
      如果没有BOM,Windows PowerShell(mis)将您的脚本解释为在遗留的“ANSI”代码页中编码(由Unicode前应用程序的系统区域设置确定;例如,美英系统上的Windows-1252)。

    相反,具有UTF-8伪BOM的文件在类Unix平台上可能会有问题,因为它们会导致Unix实用程序(如catsedawk)甚至一些编辑器(如gedit)传递伪BOM,即将其视为数据。

    • 这可能并不总是一个问题,但绝对可能是一个问题,例如当您尝试将文件读入bash中的字符串时,例如,text=$(cat file)text=$( -得到的变量将包含伪BOM作为前3个字节。

    遗憾的是,Windows PowerShell中使用的默认字符编码非常不一致;跨平台PowerShell Core edition(如上一节所讨论的)已经很好地解决了这一问题。

    注:

    >

  • 以下内容并不希望涵盖所有标准cmdlet。

    set-content(如果文件尚不存在/为空,则add-content)使用ANSI编码(由活动系统区域设置的ANSI遗留代码页指定的编码,PowerShell将其称为default)。

    export-csv确实创建了ASCII文件,如文档所示,但请参阅下面关于-append的注释。

    export-pssession默认情况下使用BOM创建UTF-8文件。

    new-item-type file-value当前创建无BOM(!)UTF-8。

    send-mailmessage帮助主题还声称ASCII编码是默认值--我还没有亲自验证这个说法。

    start-transcript总是使用BOM创建UTF-8文件,但请参阅下面关于-append的注释。

    >/out-file-append不尝试匹配文件现有内容的编码。也就是说,它们盲目地应用默认编码,除非-encode另有指示,这不是>的选项(除非在PSV5.1+中通过$PsDefaultParameterValues间接地应用默认编码,如上图所示)。简而言之:您必须知道现有文件内容的编码,并使用相同的编码进行追加。

    add-content是值得称赞的例外:在没有显式-encode参数的情况下,它检测现有编码并自动将其应用到新内容。谢谢,JS2010。请注意,在Windows PowerShell中,这意味着如果现有内容没有BOM,则应用ANSI编码,而在PowerShell Core中则是UTF-8。

    out-file-append/>add-content之间的这种不一致性也会影响PowerShell Core,本文将在GitHub问题中讨论。

    export-csv-append与现有编码部分匹配:如果现有文件的编码是ASCII/UTF-8/ANSI中的任何一种,则它盲目地追加UTF-8,但正确地匹配UTF-16LE和UTF-16BE。
    换一种说法:在没有BOM的情况下,export-csv-append假定UTF-8IS,而add-content假定ANSI。

    start-transcript-append与现有编码部分匹配:它与BOM的编码正确匹配,但如果没有ASCII编码,则默认为可能有损的ASCII编码。

    读取(即在没有BOM时使用的编码)的cmdlet:

    Get-ContentImport-PowerShellDataFile默认为ANSI(default),这与Set-Content一致。
    ANSI也是PowerShell引擎本身从文件读取源代码时默认为的。

    相比之下,import-csvimport-clixmlselect-string在没有BOM的情况下假定为UTF-8。

  •  类似资料:
    • 问题内容: 他们在“ PHP Cookbook”中说(第589页),要将传出数据的char编码正确设置为utf-8,必须将配置编辑为utf-8。 但是,我在中找不到此配置。我是否应该简单地添加一行内容? 我有一个。如您所见(),目前尚未激活。我应该删除分号并将其设置为吗?这样可以处理默认编码吗? 我还发现了其他我不知道该怎么做的编码指令: 有什么原因为什么我不能简单地将它们全部替换为? 问题答案:

    • 问题内容: 从控制台运行应用程序时,Python存在许多“无法编码”和“无法解码”的问题。但是在 IDE中,默认字符编码设置为UTF-8,我很好。 我四处寻找设置默认编码的方法,有人说在启动时会删除该函数,因此我们无法使用它。 那么什么是最好的解决方案? 问题答案: 这是一个更简单的方法(黑客),可为你提供从中删除的功能sys: 不过,这并不是一件安全的事情:这显然是一个,因为有意将其从sysPy

    • 问题内容: 有没有办法更改String(byte [])构造函数使用的编码? 在我自己的代码中,我使用String(byte [],String)指定编码,但是我使用的是无法更改的外部库。 输出为: 我尝试更改系统属性,但是它不起作用。 问题答案: 您需要在启动JVM之前更改语言环境。看到: Java,错误ID 4163515 有些地方似乎暗示您可以通过在启动JVM时设置file.encoding

    • 我正在使用带有Selenium的testNG。我有两种记录器,一种是log4j记录器,另一种是testNG reporter.log()。现在的问题是我需要记录一些中文文本。但它是作为‘????’而不是中文文本。所以我更改了log4j.properties文件,只添加了两行: 现在,在我的log4j日志中,它是正确的,但在testNG Reporter.log()中,它仍然是“?????”。

    • 我试图找到一种方法,为通过注释从Spring Boot中的application.property文件访问的属性设置UTF-8编码。到目前为止,我已经通过创建一个bean成功地将编码设置到我自己的属性源: 这样的解决方案存在两个问题。这一次,它与Spring Boot默认使用的“application.properties”位置(http://docs.Spring.io/spring-boot/

    • 问题内容: 我使用Java程序从网站下载文件,标题如下所示 没有指定编码 我要做的是下载后将文件名传递给另一个应用程序以进行进一步处理。我用 在标准输出中,字符串打印为 如何在Java中将标准输出更改为“ UTF-8”? 我尝试编码为“ UTF-8”,但内容仍然相同 更新: 我无需进行任何代码更改即可解决此问题。在我从其他应用程序将此文件称为我的jar文件的地方,我执行了以下操作 这似乎已经解决了