C#和UTF-16字符

在C#中是否可以使用不在Plane 0中的UTF-32字符作为char?

string s = ""; // valid char c = ''; // generates a compiler error ("Too many characters in character literal") 

在s中它由两个字符表示,而不是一个。

编辑:我的意思是,是否有一个字符AN字符串类型,每个字符支持完整的unicode,UTF-32或UTF-8? 例如,如果我想在字符串中的utf-32(可能不在plane0中)字符上进行for循环。

string类表示UTF-16编码的文本块, string每个char表示UTF-16代码值。

虽然没有代表单个Unicode代码点的BCL类型,但是以方法重载的forms支持超出平面0的Unicode字符,它采用string和索引而不仅仅是char 。 例如, System.Globalization.CharUnicodeInfo类上的静态GetUnicodeCategory(char)方法具有相应的GetUnicodeCategory(string,int)方法,该方法将识别从指定索引开始的简单字符或代理项对。


要遍历string的文本元素,可以使用System.Globalization.StringInfo类中的方法。 这里,“文本元素”对应于屏幕上显示的单个字符。 这意味着简单的字符( "a" ),组合字符( "a\u0304\u0308" =“ā̈”)和代理对( "\uD950\uDF21" =“ ”)都将被视为单个字符文本元素。

具体来说, GetTextElementEnumerator静态方法将允许您枚举string每个文本元素(请参阅链接的MSDN页面以获取代码示例)。

我只是从Java知道这个问题并在回答之前检查了关于char的文档 ,实际上.NET / C#和Java中的行为几乎相同。

确实一个char被定义为16位,并且绝对不能保存在Plane 0之外的任何东西。只有String / string能够处理这些字符。 在char -array中,它将表示为两个代理字符 。

C#System.String支持UTF-32就好了,但你无法遍历字符串,就像它是一个System.Char数组或使用IEnumerable一样。

例如:

 // iterating through a string NO UTF-32 SUPPORT for (int i = 0; i < sample.Length; ++i) { if (Char.IsDigit(sample[i])) { Console.WriteLine("IsDigit"); } else if (Char.IsLetter(sample[i])) { Console.WriteLine("IsLetter"); } } // iterating through a string WITH UTF-32 SUPPORT for (int i = 0; i < sample.Length; ++i) { if (Char.IsDigit(sample, i)) { Console.WriteLine("IsDigit"); } else if (Char.IsLetter(sample, i)) { Console.WriteLine("IsLetter"); } if (Char.IsSurrogate(sample, i)) { ++i; } } 

请注意Char.IsDigit和Char.IsLetter调用中的细微差别。 并且String.Length总是16位“字符”的数量,而不是UTF-32意义上的“字符”数。

关于主题,但是应用程序处理国际语言完全没有UTF-32支持,除非您有一个特定的商业案例用于模糊的历史/技术语言。