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支持,除非您有一个特定的商业案例用于模糊的历史/技术语言。