在Windows PowerShell中显示三字节Unicode字符

3

我希望我的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中,我看到一个美丽的笑脸。但是当我在独立窗口中运行脚本时,我没有看到笑脸,而是显示了两个奇怪的字符。
这里出了什么问题?

在基于.NET的PowerShell中,字符是16位的。您需要找出如何将该符号编码为两个字符。 - Lasse V. Karlsen
6
char 是一个16位类型,只能容纳16位的UTF-16代码单元,而不能表示Unicode字符的完整范围。那些编码点超出这个范围的字符必须被表示为完整的 String ([Char]::ConvertFromUtf32(0x01F600));此字符串将由两个代理字符组成。请注意,“三字节的Unicode字符”并不存在,您在术语上要小心,以免让自己混淆。Unicode字符具有(数值)编码点,在不同的编码方式下用不同数量的字节来表示。 - Jeroen Mostert
@JeroenMostert 谢谢你分享这个知识。现在我在IDE中可以看到一个漂亮的笑脸了。但是如果我在PowerShell终端窗口(Win+X)中运行脚本,它会显示两个奇怪的字符。你知道为什么吗?(请参见我的编辑) - zomega
@somega 可能的答案是,随 Windows 一起提供的控制台主机(Windows 中的默认终端主机)不支持笑脸和其他宽字符 :) 的字体。 - Mathias R. Jessen
编码问题是一个完全不同的问题。请参考此答案以获取详细信息。你应该只看到一个字符,但那可能仍然是替换字符,因为你的控制台不支持表情符号。你可以尝试直接复制并粘贴笑脸到提示符中来验证:它也会显示为替换字符。要支持表情符号,需要类似于Windows终端这样的工具;从那里启动PS将默认支持表情符号。 - Jeroen Mostert
1
Emoji的长度为2个字符。如果要自己制作表情符号,您需要进行一些代理数学计算。https://stackoverflow.com/a/62391840/6654942 - js2010
1个回答

2

1
这与UnicodeHexHTML表情解码相同。谢谢。我太懒了,不想涉及高位字节、低位字节和各种其他垃圾。 - Garric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接