【问题标题】:Display 3-byte unicode character in Windows PowerShell在 Windows PowerShell 中显示 3 字节的 unicode 字符
【发布时间】: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


【解决方案1】:

除了[Char]::ConvertFromUtf32(),还有一种方法可以手动计算超过 2 个字节或 16 位长的代码点 (http://www.russellcottrell.com/greek/utilities/surrogatepaircalculator.htm) 的代理对:

$S = 0x1F600
[int]$H = [Math]::Truncate(($S - 0x10000) / 0x400) + 0xD800
[int]$L = ($S - 0x10000) % 0x400 + 0xDC00
[char]$H + [char]$L

?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 2013-10-22
    相关资源
    最近更新 更多