热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

无BOM的写输出

如果我运行这样的命令:Write-OutputMarch>a.txt我得到这个结果:

如果我运行这样的命令:

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。我确实看到了一些类似的问题,但与此不完全相同,因为他们正在处理管道和外部命令。

回答


tl;博士


  • 如果您希望 Windows PowerShell 的>运算符和 cmdletOut-File输出无BOM 的UTF-8,您唯一的选择是更改为该编码系统范围


    • 作为一次性步骤,运行intl.cpl以打开控制面板的区域设置,切换到Administrative选项卡,单击Change system locale...按钮并选中Beta: Use Unicode UTF-8 for worldwide language support


    • 在每个会话中运行以下命令,最好通过您的$PROFILE文件完成:


      • $PSDefaultParameterValues['*:Encoding'] = 'Default'



    • 有关此更改的重要影响和背景信息,请参阅下一节。




  • 否则,您必须直接使用 .NET API - 请参阅此问题的答案- 或围绕它们编写一个 PowerShell 友好的包装器 - 请参阅此答案。


  • 或者,您可以安装跨平台PowerShell [Core] v6+版本,该版本始终默认为无 BOM 的 UTF-8。




在 Windows 10 上,您可以将 Windows PowerShell默认设置为无 BOM 的 UTF-8 - 假设您愿意在系统范围内更改为这种编码:


  • 将您的系统区域设置(非 Unicode 程序的语言)更改为无 BOM 的 UTF-8,如本答案所述:


    • 简而言之:运行intl.cpl打开控制面板的区域设置,切换到Administrative选项卡,点击Change system locale...按钮并勾选Beta: Use Unicode UTF-8 for worldwide language support;请注意,您需要具有管理权限才能进行此更改,并且需要重新启动才能使更改生效。


    • 注意事项


      • 此更改将 OEM 和 ANSI 代码页设置为65001,即无 BOM 的 UTF-8,这会影响所有控制台窗口。


      • 从 Windows 10 版本 20H2 开始,此功能仍处于测试阶段,可能会破坏传统的控制台应用程序。






  • 然后,在 Windows PowerShell v5.1 中,将以下内容添加到您的$PROFILE文件中(这在 PowerShell [Core] v6+ 中不是必需的):


    • $PSDefaultParameterValues['*:Encoding'] = 'Default'

    • $OutputEncoding = [System.Text.Utf8Encoding]::new($false)



有了这个效果:


  • 所有文件写入[1]具有一个视窗PowerShell命令-Encoding参数然后将默认为BOM-少UTF-8(Default表示活性ANSI代码页,那么这将是65001,即BOM-少UTF-8) -特别是包括>/ Out-File/ Set-Content.


  • 然后,Windows PowerShell 还会将无BOM 文件读取为 UTF-8,包括源代码和通过Get-Content; 通常,Windows PowerShell 根据系统区域设置适当的 ANSI代码页解释无 BOM 文件(而 PowerShell [Core] v6+ 假定为 UTF-8)。


  • 由于 OEM 代码页是无 BOM 的 UTF-8(反映在chcp.com报告中65001),PowerShell 也将使用无 BOM 的 UTF-8:


    • 解释通过其 CLI 从外部接收的数据时。

    • 解释从 PowerShell 会话内的外部程序接收的数据时。

    • $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中的>/ >>/默认为UTF-16LEOut-File ( “统一”)[2] ,它总是使用一个BOM。


  • 您有两种选择不同的编码方式


    • Out-File 显式使用并使用其-Encoding参数。


    • 在V5.1(也在PowerShell的[核心] V6 +),则可以设置为默认的编码>/ >>/Out-File经由$PSDefaultParameterValues偏好变量,如在讨论这个答案。


    • 然而,在Windows PowerShell中,在utf8对值-Encoding总是一个UTF-8编码与BOM,这样-除非你愿意切换到UTF-8的全系统,如上面解释的-创造的唯一途径BOM少UTF- 8个文件是直接使用.NET APIs


      • 请注意,在PowerShell [Core] v6+ 中,参数现在(更明智地)utf8接受的值-Encoding是指无BOM 的UTF-8 编码;如果您确实想要一个 UTF-8 BOM,请utf8BOM改用。







至于你尝试什么

您尝试的属性和变量仅与 PowerShell(在两个版本中)与外部程序通信的方式有关


  • $OutputEncoding确定 PowerShell 在通过管道向外部程序(后者可以通过 stdin(标准输入)读取数据)发送数据时使用的编码。


  • [Console]::OutputEncoding确定 PowerShell 在解释从外部程序接收到的输出时使用的编码。


  • [Console]::InputEncoding是编码时PowerShell使用接收数据从外部,当它的CLI被调用。


    • 警告:在这种情况下,您不能PowerShell 会话中更改此编码,因为那为时已晚。

    • 它必须由设置来电显示调用的PowerShell命令行,从cmd.exe最容易做用chcp 65001(见警告再次呼吁chcp内部PowerShell的下面)。虽然这不可避免地将两者 [Console]::InputEncoding[Console]::OutputEncoding,也就是通常需要。



笔记:


  • 在Windows中,[Console]::OutputEncoding[Console]::InputEncoding在默认情况下反映的遗留系统区域设置的OEM代码页的编码,通过报告chcp.com; 在类 Unix 平台(PowerShell [Core] v6+)上,它是(现在几乎无一例外)(无 BOM)UTF-8


  • 由于缓存这些 .NET 属性中的编码,您不能chcp.com从PowerShell内部使用来更改这些属性 - 而是直接分配所需的编码。


  • 有关更多信息,请参阅此答案,其中讨论了如何使 Windows 上的控制台窗口对外部程序始终使用无 BOM 的 UTF-8 。




[1] 从技术上讲,此首选项也适用于文件读取cmdlet,这对于无 BOM 的文件既不是绝对必要的,也不会对带有BOM 的文件造成任何损害- 即使该 BOM 指示 UTF-16 或 UTF- 32 编码 - 因为 BOM 总是覆盖-Encoding参数。

[2] 不幸的是,在 Windows PowerShell 中,不同 cmdlet 的默认编码差异很大 - 请参阅此答案的底部部分。






推荐阅读
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 解决Sharepoint 2013运行状况分析出现的“一个或多个服务器未响应”问题的方法
    本文介绍了解决Sharepoint 2013运行状况分析中出现的“一个或多个服务器未响应”问题的方法。对于有高要求的客户来说,系统检测问题的存在是不可接受的。文章详细描述了解决该问题的步骤,包括删除服务器、处理分布式缓存留下的记录以及使用代码等方法。同时还提供了相关关键词和错误提示信息,以帮助读者更好地理解和解决该问题。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • PHP引用的概念和用法详解
    本文详细介绍了PHP中引用的概念和用法。引用是指不同的变量名访问同一个变量内容,类似于Unix文件系统中的hardlink。文章从引用的定义、作用、语法和注意事项等方面进行了解释和示例。同时还介绍了对未定义变量使用引用的情况,以及在函数和new运算符中使用引用的注意事项。 ... [详细]
author-avatar
手机用户2502907815
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有