在 PowerShell 中显示 Unicode

2024-04-18

我想要实现的目标应该相当简单,尽管 PowerShell 试图让它变得困难。

我想显示文件的完整路径,其中一些文件的名称中包含阿拉伯语、中文、日语和俄语字符。

我总是得到一些无法解读的输出,如下所示:

控制台中看到的输出正被另一个脚本使用。输出包含?而不是实际的角色。

执行的命令是

(Get-ChildItem -Recurse -Path "D:\test" -Include *unicode* | Get-ChildItem -Recurse).FullName

是否有一种简单的方法来启动 PowerShell(通过命令行或以可写入脚本的方式)以便正确看到输出?

附:我在 Stack Overflow 上遇到了许多类似的问题,但除了将其称为 Windows 控制台子系统问题之外,没有一个提供太多的输入。


Note:

  • 在 Windows 上,关于渲染统一码字符,它主要是的选择font / 控制台(终端)应用这很重要。

    • 如今,使用Windows 终端 https://github.com/microsoft/terminal自 Windows 10 起通过 Microsoft Store 分发和更新,是一个很好的替代品传统控制台主机(控制台窗口由conhost.exe),提供卓越的 Unicode 字符支持。在 Windows 11 22H2 中,Windows Terminal 甚至成为了default控制台(终端) https://devblogs.microsoft.com/commandline/windows-terminal-is-now-the-default-in-windows-11/.
  • 关于以编程方式处理 Unicode人物当与外部程序, $OutputEncoding, [Console]::InputEncoding and [Console]::OutputEncoding也很重要 - 见下文。


The PowerShell(核心)7+ https://github.com/PowerShell/PowerShell/blob/master/README.md观点(参见下一节Windows PowerShell),与性格无关渲染问题(也将在下一节中介绍),就沟通而言与外部程序:

  • On Unix类平台、PowerShell Core使用UTF-8 默认情况下.

  • On Windows, 它是legacy 系统区域设置,通过其OEM 代码页,决定默认编码但在所有控制台中,包括 Windows PowerShell 和 PowerShell Core 控制台窗口最新版本的 Windows 10 现在允许将系统区域设置设置为代码页65001 (UTF-8);请注意,截至撰写本文时,该功能仍处于测试阶段,并且使用它已经影响深远 - see 这个答案 https://stackoverflow.com/a/57134096/45375.

    • 如果您确实使用该功能,PowerShellCore控制台窗口将自动识别 UTF-8,尽管在Windows PowerShell你仍然需要设置$OutputEncoding也转换为 UTF-8(在 Core 中已经默认为 UTF-8),如下所示。

    • 否则 - 特别是在较旧的 Windows 版本上 - 您可以使用与下面详细介绍的 Windows PowerShell 相同的方法。


制作你的Windows PowerShell控制台窗口支持 Unicode (UTF-8):

  • Pick a TrueType(TT) 字体支持特定的scripts(书写系统、字母表)您希望在控制台中正确显示其字符:

    • 重要的: While 所有 TrueType 字体都支持 Unicode原则, they 通常只支持一个subset所有 Unicode 字符,即对应于特定字符的字符scripts(书写系统),例如拉丁文字、西里尔文字(俄语)……
      在您的特定情况下 - 如果您必须支持阿拉伯语以及中文、日语和俄语字符 - 您唯一的选择是SimSun-ExtB,可在仅限 Windows 10.
      See 维基百科 https://en.wikipedia.org/wiki/List_of_typefaces_included_with_Microsoft_Windows了解哪些 Windows 字体针对哪些脚本(字母表)的列表。

    • 要更改字体,请单击窗口左上角的图标,然后选择Properties,然后更改为Fonts选项卡并选择感兴趣的 TrueType 字体。

      • See 这个苏答案 https://superuser.com/a/1381619/116221 by 不是2quibit https://stackoverflow.com/users/1147688/not2qubit了解如何使其他字体可用。
  • 此外,为了与外部程序:

    • The console window's code page must be switched to 65001, the UTF-8 code page (which is usually done with chcp 65001, which, however, cannot be used directly from within a PowerShell session[1], but the PowerShell command below has the same effect).

    • 必须指示 Windows PowerShell 使用 UTF-8 进行通信外部实用程序 too,都在发送管道输入时to外部程序,通过它$OutputEncoding偏好变量(在解码输出上from外部程序,它是存储在的编码[Console]::OutputEncoding所应用的)。

Windows PowerShell 中的以下魔法咒语可以实现此目的(如上所述,这隐含地施行chcp 65001):

$OutputEncoding = [Console]::InputEncoding = [Console]::OutputEncoding =
                    New-Object System.Text.UTF8Encoding

To persist这些设置,即让您未来的交互式 PowerShell 会话默认支持 UTF-8,将上面的命令添加到您的$PROFILE file.

注意:最新版本的 Windows 10 现在允许设置系统区域设置到代码页65001 (UTF-8) https://stackoverflow.com/a/57134096/45375(截至 Window 10 版本 1903,该功能仍处于测试阶段),这使得all控制台窗口默认为 UTF-8,包括 Windows PowerShell。
如果您确实使用该功能,请设置[Console]::InputEncoding / [Console]::OutputEncoding那么不再是绝对必要的,但你仍然需要设置$OutputEncoding(这在 PowerShell 中不是必需的Core, where $OutputEncoding已默认为 UTF-8)。

重要的:

  • These 设置假定您与之通信的任何外部实用程序都期望 UTF-8 编码输入并生成 UTF-8 输出.

    • 例如,用 Node.js 编写的 CLI 就满足该标准。
    • Python 脚本 - 如果编写时考虑到 UTF-8 支持 - 也可以处理 UTF-8(请参阅这个答案 https://stackoverflow.com/a/67778646/45375).
  • 相比之下,这些设置可以break(较旧的)只需要单字节编码的实用程序正如系统的旧版 OEM 代码页所暗示的那样。

    • 直到 Windows 8.1,这甚至包括标准 Windows 实用程序,例如find.exe and findstr.exe,这些问题已在 Windows 10 中修复。
    • 请参阅本文底部,了解如何通过切换到 UTF-8 来绕过此问题暂时的,按需的用于调用给定的实用程序。
  • 这些设置适用于仅外部程序并且与编码无关PowerShell 的 cmdlet在输出上使用:

    • See 这个答案 https://stackoverflow.com/a/40098904/45375PowerShell cmdlet 使用的默认字符编码;简而言之:如果您想要 cmdletWindows PowerShell默认为 UTF-8(其中PowerShell [核心] v6+无论如何),添加$PSDefaultParameterValues['*:Encoding'] = 'utf8'给你的$PROFILE,但请注意,这将影响对 cmdlet 的所有调用-Encoding会话中的参数,除非明确使用该参数;还请注意,在Windows PowerShell你总是会得到 UTF-8 文件with BOM;相反,在PowerShell [核心] v6+,默认为 BOM-lessUTF-8(都在没有-Encoding-Encoding utf8,你必须使用'utf8BOM'.

可选背景信息

Tip of the hat to eryksun https://stackoverflow.com/users/205580/eryksun for all his input.

  • 当 TrueType 字体处于活动状态时, 控制台窗口buffer正确保留(非 ASCII)Unicode 字符。即使他们不这样做render正确地;也就是说,即使他们可能appear一般为?,以表明当前字体不支持,您可以复制粘贴正如 eryksun 指出的那样,这些字符可以在其他地方使用,而不会丢失信息。

  • PowerShell能够输出Unicode字符到控制台即使没有切换到代码页65001 first.
    然而,这本身确实not保证其他程序可以正确处理此类输出 - 见下文。

  • 到那个时刻与…沟通外部程序 via stdout (piping), Powershell 使用中指定的字符编码$OutputEncoding偏好变量, which Windows PowerShell 中默认为 ASCII(!),这意味着任何非 ASCII 字符都会音译为literal ?字符,导致信息丢失。 (相比之下,值得称赞的是,PowerShellCore(v6+) 现在一致使用(无 BOM)UTF-8 作为默认编码。)

    • 然而相比之下,传递非 ASCII论点(而不是 stdout(管道)输出)外部程序似乎需要no特殊配置(我不清楚为什么会这样);例如,以下 Node.js 命令正确返回€: 1即使使用默认配置:
      node -pe "process.argv[1] + ': ' + process.argv[1].length" €
  • [Console]::OutputEncoding:

    • 控制当控制台将程序输出转换为控制台显示字符时采用的字符编码。
    • also tells 电源外壳何时采用什么编码捕获输出来自外部程序.
      结果是,如果你需要捕获输出从生成 UTF-8 的程序中,您需要设置[Console]::OutputEncoding也为 UTF-8;环境$OutputEncoding仅涵盖input(对于外部程序)方面。
  • [Console]::InputEncoding sets the encoding for keyboard input into a console[2] and also determines how PowerShell's CLI https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_pwsh interprets data it receives via stdin (standard input).

  • 如果将控制台切换为 UTF-8整个会议不是一个选择,你可以这样做暂时,对于给定的呼叫:

      # Save the current settings and temporarily switch to UTF-8.
      $oldOutputEncoding = $OutputEncoding; $oldConsoleEncoding = [Console]::OutputEncoding
      $OutputEncoding = [Console]::OutputEncoding = New-Object System.Text.Utf8Encoding
    
      # Call the UTF-8 program, using Node.js as an example.
      # This should echo '€' (`U+20AC`) as-is and report the length as *1*.
      $captured = '€' | node -pe "require('fs').readFileSync(0).toString().trim()"
      $captured; $captured.Length
    
      # Restore the previous settings.
      $OutputEncoding = $oldOutputEncoding; [Console]::OutputEncoding = $oldConsoleEncoding
    
  • 旧版本 Windows(W10 之前)上的问题:

    • 一个活跃的chcp的价值65001在旧版本的 Windows 中,破坏某些外部程序甚至批处理文件的控制台输出最终可能是由于WriteFile()Windows API 函数(标准 C 库也使用),错误地报告了数量人物而不是bytes带代码页65001实际上,正如所讨论的这篇博文 http://blogs.msdn.com/b/michkap/archive/2011/03/09/10138478.aspx.
  • 据评论称,由此产生的症状bobince https://stackoverflow.com/users/18936/bobince on 这个答案 https://stackoverflow.com/a/388500/45375从 2008 年开始,是:“我的理解是,返回字节数的调用(例如 fread/fwrite/等)实际上返回字符数。这会导致各种各样的症状,例如输入不完整 -读取、挂起、批处理文件损坏等等。”


本地 Windows 控制台(终端)的高级替代品,conhost.exe

eryksun 建议两种本机 Windows 控制台窗口的替代品 (conhost.exe),哪个提供商更好更快的 Unicode 字符渲染,由于使用现代 GPU 加速的 DirectWrite/DirectX API,而不是“无法处理复杂脚本、非 BMP 字符或自动后备字体的旧 GDI 实现”。

  • 微软自己的,开源的Windows 终端 https://github.com/microsoft/terminal,自 Windows 10 起通过 Microsoft Store 分发和更新 - 请参阅here https://devblogs.microsoft.com/commandline/introducing-windows-terminal/进行介绍。

  • 历史悠久的第三方替代品ConEmu https://conemu.github.io/,它的优点是也可以在较旧的 Windows 版本上运行。


[1] Note that running chcp 65001 from inside a PowerShell session is not effective, because .NET caches the console's output encoding on startup and is unaware of later changes made with chcp (only changes made directly via [console]::OutputEncoding] are picked up).

[2] I am unclear on how that manifests in practice; do tell us, if you know.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PowerShell 中显示 Unicode 的相关文章

  • xsel -o 对于 OS X 等效项

    是否有一个等效的解决方案可以在 OS X 中抓取选定的文本 就像适用于 Linux 的 xsel o 一样 只需要当前的选择 这样我就可以在 shell 脚本中使用文本 干杯 埃里克 你也许可以安装xsel在 MacOS 上 更新 根据 A
  • VS Code 即使关闭也使用 100% CPU

    即使未打开 VS Code 也会占用 100 的 CPU 使用率 我跑了ps aux grep PID命令查看详细信息但什么也看不懂 这是输出 tawhid 27099 100 0 0 1 447352160 11856 R 7 18PM
  • json 解析器和编码器应如何处理转义的 unicode?

    json 规范允许在 json 字符串 格式为 uXXXX 中转义 unicode 它特别提到受限代码点 非字符 作为有效的转义代码点 这是否意味着解析器应该从包含非字符和受限代码点的字符串生成非法的 unicode 一个例子 key uF
  • 使用 UTF-8 编码的 Powershell 字符串变量

    我检查了许多与此相关的问题 但找不到解决我的问题的东西 基本上 我想将 UTF 8 编码的字符串存储在变量中 然后使用该字符串作为文件名 例如 我正在尝试下载 YouTube 视频 如果我们打印视频标题 则会显示非英文字符 ytd这是you
  • 将变量传递给 Start-Job

    我必须在这里遗漏一些非常简单的东西 这是一个非常基本的脚本来说明我正在尝试的内容 Computers comp1 comp2 ScriptBlock New Item C Temp C txt Force Foreach C in Comp
  • 导入模块 WebAdministration 不会从脚本加载,但会从命令行加载

    我正在进行一个使用的项目PowerShell编写构建脚本 该构建利用了WebAdministration模块来管理本地 IIS 实例 当我运行构建脚本时 尝试导入时会引发以下错误WebAdministration 错误 06 29 2016
  • zsh:未找到命令:使用 Big Sur Mac 的终端上的 R

    我从官方 cran 网站安装了 R 我可以从 Rstudio 运行 R 但是当我尝试从终端使用 R 时 我得到以下结果 base ege Eges MBP R zsh command not found R base ege Eges MB
  • Import-Csv - 成员已存在问题

    我必须将多个 CSV 文件合并为一个文件 每个 CSV 都有一个标题 其中一列标题是相同的 理想情况下 最终文件 all out csv 必须有一个标头 我运行 PowerShell 代码 Import Csv out 1 result c
  • .profile 无法从 Mac 终端运行

    我有一个 profile 文件 我正在终端中读取并使用别名 但在某些时候 别名由于没有明确的原因而停止工作 其他命令仍在工作 为了快速修复 我删除了 rm 并在用户目录中重新创建了 profile 文件 我可以看到 至少在该目录中没有 ba
  • 如何将 Unicode 字符转换为简单形式? [复制]

    这个问题在这里已经有答案了 有没有一个Go库可以Sj str m作为输入和返回Sjostrom作为输出 您可以使用golang org x text unicode norm来处理这个问题 package main import fmt i
  • 远程计算机上的活动登录用户

    我正在使用下面的脚本来获取远程计算机上的登录用户 它工作正常 但我需要让用户处于 活动 状态 如何获取远程计算机上的活动登录用户 function Global Get LoggedOnUser Requires Version 2 0 C
  • 如何检查 Oracle 数据库中的商标(™) 字符设置是否正确?

    如何检查 Oracle 数据库中的商标 字符设置是否正确 我希望它使用 UTF 8 编码存储 我在 Salesforce com 字段中存储了一个值 从 GUI 来看 该值如下所示 注意商标字符 Chuck Norris s Roundho
  • 经典的asp字符编码

    我在经典 asp 网站中遇到西班牙字符问题 用户可以在 aspx 页面上的表单中提交他们的姓名 地址 然后 aspx 页面将 ajax post 发送到经典的 asp 页面 它所做的所有操作都存储在我们的 Sql 2008 DB 中 我可以
  • 动态参数值取决于另一个动态参数值

    启动前提 非常严格的环境 Windows 7 SP1 Powershell 3 0 使用外部库的可能性有限或不可能 我正在尝试重写之前创建的 bash 工具 这次使用 PowerShell 在 bash 中 我实现了自动完成功能 以使该工具
  • Powershell v2 远程处理和委派

    我在两台机器上安装了 Powershell V2 并在两台机器上运行 Enable PsRemoting 两台机器都是Win 2003 R2 并且都加入了同一个活动目录域 我可以成功地远程运行命令 所以PS远程处理是在本地服务器和远程服务器
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • 启动过程中的写入进度 - 等待

    我正在尝试创建安装脚本并在安装过程中显示进度条 localfolder Get Location path start process FilePath localfolder Installer exe ArgumentList sile
  • 为什么 PowerShell 中的整数按数字进行比较?

    我的代码告诉你你猜测的数字是高于还是低于随机生成的数字 但它似乎只在其中一个数字低于 10 时才比较数字的前几位 int GeneratedNum Get Random min 1 max 101 Write Debug Generated
  • 为什么在 Python 2.4 中使用 Unicode 数据会出现 ASCII 编码错误,而在 2.7 中却不会?

    我有一个程序 当在 Python 2 7 中运行时 会生成正确的 Unicode 输出到标准输出 当在 Python 2 4 中运行时 我得到UnicodeEncodeError ascii codec can t encode chara
  • 如何在 VSTS 中的托管代理上运行或安装工具

    我想在 VSTS 上以管理员身份运行 cmd 实际上 我正在尝试在 VSTS 托管代理上安装带有 Chocolatey 工具管理器的 git tfs 因此我在 VSTS 命令行任务上运行以下命令 SystemRoot System32 Wi

随机推荐

  • JPA 标准 API 按 NULL 最后排序

    我使用 JPA 标准 API 从数据库中获取记录 我有实体Record带字段dateTime可以为空 我会编码 public List
  • Dapr 和 Docker Compose 指南

    我正在绕圈试图找出如何做到这一点 但我遇到了以下情况 我正在尝试将 Dapr 合并到我的 ASP NET Core 微服务中 我已按照文档在本地安装了 Dapr dapr init 结果我有三个本地运行的容器 dapr redis dapr
  • 训练 h2o 模型时如何抑制“构建进度”栏?

    我正在通过测试许多模型来调整我的参数 但令我相当恼火的是 我对那些弄乱了我的 iPython Notebook 的 构建进度 栏无能为力 我浏览了文档 寻找某种要关闭的 详细 设置 但找不到它 当我想同时训练和评估数十个模型时 有什么方法可
  • 使用 Thymeleaf 和 Spring Boot 转换器列出 JSON 字符串

    我正在开发一项通过 Thymeleaf 模板生成 HTML 页面的服务 在其中一个模板中 我希望有一个 HTML 属性作为 JSON 字符串 我的上下文中的相关对象是ArrayList
  • 如何在 Visual Studio 安装项目中创建卸载程序?

    我已经创建了一个 Visual Studio 安装项目 但我不知道如何在我的 Visual Studio 安装项目中创建卸载程序 请告诉我该怎么做 我正在使用 Visual Studio 2005 或者是否有任何其他软件可以使用卸载程序创建
  • Oracle JDBC:用户名/密码无效 (ora-01017)

    我在与 Oracle 数据库服务器的 jdbc 连接上遇到了一个奇怪的问题 我们在 tomcat 服务器上运行应用程序 这些应用程序使用 oracle 数据库 所有应用程序都使用相同的凭据 应用程序全天运行良好 晚上没有活动 早上 当应用程
  • 使用给定的 DateTime 对象获取一个月的第一天和最后一天

    我想获取给定日期所在月份的第一天和最后一天 该日期来自 UI 字段中的值 如果我使用时间选择器我可以说 var maxDay dtpAttendance MaxDate Day 但我试图从 DateTime 对象中获取它 所以如果我有这个
  • 更改 Android 上活动动画的 z 顺序

    有没有办法反转活动动画的 z 顺序 基本上 当您启动新活动时 它会被添加到后台堆栈 并且其窗口会添加到前一个活动的窗口上 有时稍后返回时 从后台堆栈获取的活动会在顶部活动下方显示其窗口 大多数时候这是完全有道理的 但我对这种行为有以下问题
  • 如何解决SBT依赖的依赖冲突?

    我有一个项目的构建 sbt正在使用 libraryDependencies Seq com lerestau killer launcher 1 0 2 com lerestau menu starter 1 0 0 菜单启动器过渡下载 杀
  • JavaFX检测同时按下的多个键盘按键

    正如标题所说 我想检测同时按下的多个键盘按键 同时地 并被按下 同时地 一段时间 我正在尝试添加多个事件处理程序Scene但它不起作用 EventHandler
  • MySQL如何获取不是我好友的用户

    有人可以帮助我吗 我需要吸引不是我朋友的用户 我有以下表格 users id user 1 Name1 2 name2 和桌子friends id id user id friends 1 2 3 2 5 4 我尝试类似的操作 但在某些查询
  • 全文索引和复合索引以及它们如何影响查询

    只是说我有一个查询如下 SELECT name category address city state FROM table WHERE MATCH name subcategory category tag1 AGAINST educat
  • 与断言相比,scala 中的假设有何含义?

    Scala 似乎定义了 3 种断言 assert require and assume 据我所知 差异 与通用断言相比 require它是专门用于检查输入 参数 传入消息等 的 是什么意思assume then 如果你看一下代码Predef
  • 关闭 WPF 中 Frame 内的页面

    我有一个窗口和一个框架 在该框架中 我打开了许多页面 我想通过单击 关闭 按钮关闭这些页面 问题是页面看不到我的框架我尝试在页面方法中的事件中编写关闭按钮 在主窗口中执行另一个事件 因为在主窗口上很容易看到框架 但它不起作用 这是我在页面中
  • Bootstrap 输入组插件未内联

    这是我的代码 http www bootply com iR1SvOyEGH http www bootply com iR1SvOyEGH
  • SwiftUI 中的圆角边框

    如何在 SwiftUI 中圆化边框 我认为这会起作用 cornerRadius 10 border Color white 但它不起作用 这是我现在的解决方法 overlay RoundedRectangle cornerRadius 10
  • 限制特定组的 Firebase 数据库和存储写入访问权限

    我有一个带有内容管理端的 React Redux Firebase 应用程序 所有这些页面都以 admin 我需要将 Firebase 数据库和 Firebase 存储写入权限限制为这些用户的一小部分 并在未经身份验证 或未经管理员角色身份
  • 从.c调用MASM32过程

    我现在正在使用 Visual Studio 我需要构建一个 win32 应用程序并需要从 C 函数调用过程 但我总是收到构建错误 错误 3 错误 LNK1120 1 个未解析的外部 我已经通过一个过程将所有内容简化为一个简单的主函数和简单的
  • CodeIgniter - 删除文件,路径问题

    我的根目录中有 3 个文件夹 application system 和 uploads 在 application controllers mycontroller php 我有这行代码 delete files uploads file
  • 在 PowerShell 中显示 Unicode

    我想要实现的目标应该相当简单 尽管 PowerShell 试图让它变得困难 我想显示文件的完整路径 其中一些文件的名称中包含阿拉伯语 中文 日语和俄语字符 我总是得到一些无法解读的输出 如下所示 控制台中看到的输出正被另一个脚本使用 输出包