C# 使用Unicode将字符串大写的这种方法安全吗?

C# 使用Unicode将字符串大写的这种方法安全吗?,c#,unicode,utf-16,C#,Unicode,Utf 16,建议仅使用字符串大写的第一个字符的各种方法 但所有这些基本上都与此等效: char.toupper不变量(st[0])+str.Substring(1) 我对unicode规范了解不够,不知道这是否真的安全。您是否曾经有过一个大于1char且可以大写的代码点 请注意,C#中的字符是UTF16,ToUpperInvariant最终将操作系统API调用为大写的char您的问题归结为“基本多语言平面之外是否有可以大写的字符”,答案是“是的,但不太可能有必要这样做,而且你需要制定自己的规则,不管怎样,

建议仅使用字符串大写的第一个字符的各种方法

但所有这些基本上都与此等效:

char.toupper不变量(st[0])+str.Substring(1)
我对unicode规范了解不够,不知道这是否真的安全。您是否曾经有过一个大于1
char
且可以大写的代码点


请注意,C#中的字符是UTF16,
ToUpperInvariant
最终将操作系统API调用为大写的
char

您的问题归结为“基本多语言平面之外是否有可以大写的字符”,答案是“是的,但不太可能有必要这样做,而且你需要制定自己的规则,不管怎样,因为在不变的文化中没有规则”(不过,后者是我受过教育的推测)。如果根据某些区域性,存在需要大写的非BMP字符,则字符串可能会更改长度,并且您正在考虑使用
StringInfo.SubstringByTextElements
(以及
string.ToUpper
使用某些自定义区域性)。实际上,上面的BMP中有225个小写字母。您可以使用
char.IsHighSurrogate(str[0])将
str.Substring(0,2).ToUpperInvariant()
大写
..@JosefZ:nice find,尽管
.ToUpperInvariant
是否会触及这些字符似乎有所不同,可能是由于.NET/底层操作系统使用的Unicode版本/排序表(这两个版本的详细信息有所不同)。