我希望我的PowerShell脚本能够支持Unicode和尽可能多的字符。作为编码方式,我想使用UTF-8。因此,为了测试目的,我只需输入以下行并按回车键:
[char]0x02A7
它成功地显示了字符ʧ。
但当我尝试显示一个Unicode字符(> 0xFFFF)时:
[char]0x01F600
它会抛出一个错误,告诉你值128512无法转换为System.Char。相反,它应该显示笑脸。
这里有什么问题?
编辑:
正如Jeroen Mostert在评论中所述,我必须使用另一个命令来处理代码点大于0xFFFF的Unicode字符。因此,我编写了这个脚本:
$s = [Char]::ConvertFromUtf32(0x01F600)
Write-Host $s
在PowerShell IDE中,我看到一个美丽的笑脸。但是当我在独立窗口中运行脚本时,我没有看到笑脸,而是显示了两个奇怪的字符。
这里出了什么问题?
char
是一个16位类型,只能容纳16位的UTF-16代码单元,而不能表示Unicode字符的完整范围。那些编码点超出这个范围的字符必须被表示为完整的String
([Char]::ConvertFromUtf32(0x01F600)
);此字符串将由两个代理字符组成。请注意,“三字节的Unicode字符”并不存在,您在术语上要小心,以免让自己混淆。Unicode字符具有(数值)编码点,在不同的编码方式下用不同数量的字节来表示。 - Jeroen Mostert