.net 如何在API中表示Unicode字符

.net 如何在API中表示Unicode字符,.net,api,unicode,mbcs,.net,Api,Unicode,Mbcs,这与其说是一个Unicode问题,不如说是一个MBCS问题。我需要创建一个API,它返回一个结构列表,每个实例将一个Unicode字符作为其成员之一。这是在.NET中,所以您可能认为我需要UTF-16,但对于亚洲字符,需要两个字符。返回Unicode字符的最佳实践是什么 使用一个由2个UTF-16字符组成的数组-测试第一个字符,看看它是否是代理字符,是否有一个计数 忽略代理项问题,让调用者自行确定实际的glyph编码跨结构 改用字符串,这样我就不在乎它的长度是一个字符还是两个字符 使用UTF-3

这与其说是一个Unicode问题,不如说是一个MBCS问题。我需要创建一个API,它返回一个结构列表,每个实例将一个Unicode字符作为其成员之一。这是在.NET中,所以您可能认为我需要UTF-16,但对于亚洲字符,需要两个字符。返回Unicode字符的最佳实践是什么

  • 使用一个由2个UTF-16字符组成的数组-测试第一个字符,看看它是否是代理字符,是否有一个计数
  • 忽略代理项问题,让调用者自行确定实际的glyph编码跨结构
  • 改用字符串,这样我就不在乎它的长度是一个字符还是两个字符
  • 使用UTF-32
  • 人们通常为UTF-8做什么?我猜它们从不处理单个字符,所有内容都保存在字符串中(例如,搜索字符串中的字符实际上是通过查找子字符串来完成的)。也许是我的C++程序员,但字符串似乎是如此沉重。


    我想我要做第三件事。其他人做了什么?

    关于使用字符串,您是对的。在Unicode中,因为即使是单个字符也可能需要多个代码点(每个代码点都需要一定数量的字节,具体取决于编码),所以除了字符串之外,您无法处理任何其他字符。甚至像
    isUpper
    之类的函数也应该使用字符串,并且只处理它的第一个元素

    一个字符可能需要多个代码点的原因通常是因为组合字符、重音等


    看看这个。

    关于使用字符串,你是对的。在Unicode中,因为即使是单个字符也可能需要多个代码点(每个代码点都需要一定数量的字节,具体取决于编码),所以除了字符串之外,您无法处理任何其他字符。甚至像
    isUpper
    之类的函数也应该使用字符串,并且只处理它的第一个元素

    一个字符可能需要多个代码点的原因通常是因为组合字符、重音等


    看看这个。

    一开始我确信口音不会有问题,但我认为事实上是这样的。我假设会有一个规范化表单,它将使所有内容都适合于单个代码点。在我的例子中,我想将glyph+任何数量的重音作为一个“字符”来处理。是的,只有一些重音字符可以放入一个代码点,通常是来自unicode之前的字符集。起初我相信重音不会有问题,但我想实际上是这样的。我假设会有一个规范化表单,它将使所有内容都适合于单个代码点。在我的例子中,我希望将glyph+任意数量的重音字符视为单个“字符”。是的,只有一些重音字符可以放入单个代码点,通常是来自unicode之前的字符集。