Powershell `Get-Clipboard` 的编码问题

Encoding issue with Powershell `Get-Clipboard`

我想通过命令行从剪贴板中检索 HTML 并且正在努力获得正确的编码。

例如,如果您打开命令prompt/WSL,复制以下⇧Shift+⭾TAB和运行:

powershell.exe Get-Clipboard

检索到正确的文本(⇧Shift+⭾TAB)。

但是如果您随后尝试将剪贴板检索为 html:

powershell.exe "Get-Clipboard -TextFormatType html"

检索到以下文本

...⇧Shift+⭾TAB...

这似乎是 Get-Clipboard commandlet 的一部分编码混乱。如何解决这个问题?


编辑:正如@Zilog80 在评论中指出的那样,文本的编码确实与假定的文本编码不匹配。我可以在 Ruby 中纠正,例如使用:

out = `powershell.exe Get-Clipboard -TextFormatType html`
puts out.encode('cp1252').force_encoding('utf-8')

知道如何在命令行上实现同样的功能吗?

这确实是Get-Clipboard的缺点。 HTML 格式 documented 仅支持 UTF-8,无论页面的源编码如何,因此 cmdlet 应该这样解释它,但事实并非如此。

我推测 PowerShell 在解码数据时将使用的编码,但它可能是系统默认的 ANSI 编码。那样的话

[Text.Encoding]::UTF8.GetString([Text.Encoding]::Default.GetBytes( `
    (Get-Clipboard -TextFormatType Html -Raw) `
)) 

将重新编码文本,但需要注意的是,如果默认 ANSI 编码未涵盖 0-255 的所有代码点,则某些字符可能会丢失。幸运的是 Windows-1252(最常见的默认值)确实涵盖了所有代码点。