【发布时间】:2021-12-30 01:37:10
【问题描述】:
我想在我的 PowerShell 脚本中支持 Unicode 和尽可能多的字符。作为编码,我想使用 UTF-8。因此,出于测试目的,我只需键入此行并按 Enter:
[char]0x02A7
并成功显示字符ʧ。
但是当我尝试显示 Unicode 字符 (> 0xFFFF) 时:
[char]0x01F600
它会抛出一个错误,指出值 128512 不能转换为 System.Char。 相反,它应该显示笑脸 ????。
这里有什么问题?
编辑:
正如 Jeroen Mostert 在 cmets 中所说,对于代码点 > 0xFFFF 的 unicode 字符,我必须使用另一个命令。所以我写了这个脚本:
$s = [Char]::ConvertFromUtf32(0x01F600)
Write-Host $s
在 PowerShell IDE 中,我得到一个漂亮的笑脸????。但是当我独立运行脚本(在自己的窗口中)时,我没有得到笑脸。 相反,它显示了两个奇怪的字符。
这里有什么问题?
【问题讨论】:
-
在 Powershell 所基于的 .NET 中,字符是 16 位的。您必须弄清楚将该符号编码为两个字符。
-
char是 16 位类型,仅包含 16 位 UTF-16 代码单元,而不是 Unicode 字符的全部范围。代码点超出此范围的字符必须表示为完整的String([Char]::ConvertFromUtf32(0x01F600));该字符串将由两个代理字符组成。请注意,没有“3 字节 Unicode 字符”之类的东西,您必须小心此处的术语,以免混淆自己。 Unicode 字符具有(数字)代码点,它们以不同的方式表示,所需的字节数取决于所使用的编码。 -
@JeroenMostert 感谢您提供这些知识。我现在在 IDE 中得到一个漂亮的笑脸。但如果我在 PowerShell 终端窗口 (Win+X) 中运行脚本,它会显示两个奇怪的字符。你知道为什么吗? (另见我的编辑)
-
@somega 答案很可能是控制台主机(Windows 中的默认终端主机)附带的字体不支持笑脸和其他宽字符 :)
-
编码问题完全不同。有关大量血腥细节,请参阅this answer。您应该只看到 一个 字符,但这可能仍然是替换字符,因为您的控制台不支持表情符号。您可以通过尝试将笑脸直接复制粘贴到提示符来验证这一点:它也会在那里显示为替换字符。表情符号支持需要 Windows Terminal 之类的东西;默认情况下,从那里启动 PS 会为您提供表情符号支持。
标签: powershell unicode