如何在C#中使用32位Unicode字符?

4
也许我不需要32位字符串,但我需要表示32位字符。 http://www.fileformat.info/info/unicode/char/1f4a9/index.htm 现在我使用Symbola字体,当我将它粘贴到URL或任何文本区域时,我可以看到该字符,所以我知道我有它的字体支持。
但是,如何在我的C#/.NET应用程序中支持它?
-编辑- 我要补充一些内容。当我将该字符粘贴到我的.NET winform应用程序中时,我无法正确地看到该字符。当我将其粘贴到Firefox中时,我可以正确地看到它。如何在我的winform应用程序中正确地显示字符?

即使在PHP中,“8位=4字节”也是错误的。 - H H
关于“我无法正确地看到字符”的问题:你的应用程序使用什么字体?该字体是否包含你要粘贴的字符? - svick
@svick:我正在使用winform,一个文本框,并将字体设置为symbola。我无法正确地看到字符。 - user34537
这对我来说似乎很好用。你所说的“我无法正确地看到字符”是什么意思?那你究竟看到了什么? - svick
请务必阅读以下内容:http://joelonsoftware.com/articles/Unicode.html - Kevin Depue
显示剩余2条评论
3个回答

9

我不确定我理解你的问题:

  • .NET中的字符串是UTF-16编码的,你无法改变这一点。如果你想获取一个字符串的UTF-32版本,你需要使用UTF32Encoding类将其转换为字节数组。
  • .NET中的字符因此长度为16位,并且你也无法改变这一点。UTF-32编码的字符只能用一个字节数组(4个项目)表示。你可以使用UTF32Encoding类来实现这个目的。
  • 每个UTF-32字符都有一个等效的UTF-16表示,反之亦然。因此,在这个上下文中,我们只能谈论字符及其不同的表示(编码),UTF-16是.NET平台上的首选表示。

3
您没有说明“支持”具体指什么。但是,除非您进行字符串操作,否则没有什么特别需要做的来处理不适合一个16位char的字符。它们将被表示为代理对,但如果您将string作为一个整体处理,则不需要了解这一点。
有一个例外,即某些字符串操作方法无法正常工作。例如,"\U0001F4A9".Substring(1)将返回代理对的第二半部分,这不是有效的字符串。

0
如果问题实际上是:
“如何将'一堆便便'表情符号U+1F4A9放入C#字符串文字中,考虑到它需要32位来表示UTF-16代码页?”
那么答案是:
"\U0001F4A9"

在 Visual Studio 的 C# 交互窗口中,这将显示以下输出:

Screenshot of C# interactive window in Visual Studio showing that the escape sequence will print out a single pile of poo emoji, , when evaluated.

请注意使用大写的\U转义代码。它必须后跟恰好八个十六进制数字,而不像\u,它必须后跟恰好四个十六进制数字。请参阅C#语言参考中的Unicode字符转义序列

还要注意,"\U0001F4A9".Length评估为2,因为Length始终返回字符串中十六位字符的数量,而不是字符串中Unicode字符的数量。

当字符串被打印出来时,只要编码转换一路正确,您应该只看到一个字符。

请注意,U+1F4A9是OP问题中链接的示例表情符号。


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