C#:读取字符串的第一个字符,当char的unicode值> 65535时

use*_*248 1 c# unicode utf-16 utf-32

我有一个C#方法需要检索字符串的第一个字符,并查看它是否存在于包含特定unicode字符的哈希集中(所有从右到左的字符).

所以我在做

var c = str[0];
Run Code Online (Sandbox Code Playgroud)

然后检查hashset.

问题是这个代码不适用于第一个char的代码点大于65535的字符串.

我实际创建了一个循环,遍历0到70,000之间的所有数字(最高RTL代码点大约68,000,所以我向上舍入),我从数字创建一个字节数组,并使用

Encoding.UTF32.GetString(intValue);
Run Code Online (Sandbox Code Playgroud)

用这个字符创建一个字符串.然后我将它传递给在HashSet中搜索的方法,并且该方法失败,因为它何时获得

str[0]
Run Code Online (Sandbox Code Playgroud)

这个价值永远不会是应有的.

我究竟做错了什么?

Tom*_*get 5

A String是一系列UTF-16代码单元,一个或两个编码Unicode代码点.如果要从字符串中获取代码点,则必须迭代字符串中的代码点."字符"也是基本码点,后跟零个或多个组合码点的序列("组合字符").

// Use a HashSet<String>

var itor = StringInfo.GetTextElementEnumerator(s);
while (itor.MoveNext()) {
    var character = itor.GetTextElement();
    // find character in your HashSet
}
Run Code Online (Sandbox Code Playgroud)

如果您不需要考虑组合代码点,则可以将其擦除.(但在某些语言中它们非常重要.)