是否可以将字符串转换为序数大写或小写。类似于不变量。
string upperInvariant = "ß".ToUpperInvariant();
string lowerInvariant = "ß".ToLowerInvariant();
bool invariant = upperInvariant == lowerInvariant; // true
string upperOrdinal = "ß".ToUpperOrdinal(); // SS
string lowerOrdinal = "ß".ToLowerOrdinal(); // ss
bool ordinal = upperOrdinal == lowerOrdinal; // false
如何实现ToUpperOrdinal和ToLowerOrdinal?
编辑: 如何获得序数字符串表示?同样,如何获得不变的字符串表示?也许这是不可能的,因为在上述情况下它可能是模糊的,至少对于序数表示。
EDIT2:
string.Equals("ß", "ss", StringComparison.InvariantCultureIgnoreCase); // true
但是
"ß".ToLowerInvariant() == "ss"; // false
答案 0 :(得分:1)
来自msdn:
OrdinalIgnoreCase属性返回的TheStringComparer将字符串中的字符视为比较,就像使用不变文化的约定将它们转换为大写一样,然后执行独立于语言的简单字节比较。
但是我猜这样做不会达到你想要的效果,因为只需要做“ß”.ToUpperInvariant()不会给你一个通常与“ss”等效的字符串。 String.Equals方法中必须有一些魔法来处理Why “ss” equals 'ß'的特殊情况。
如果您只担心德语文本,请this answer might help。
答案 1 :(得分:1)
我不相信.NET Framework或.NET Core中存在此功能。最接近的是string.Normalize(),但它缺少成功将其关闭的案例折叠选项。
此功能存在于ICU project(可在C / Java中使用)中。您所使用的功能是C中的unorm2.h文件或Java中的Normalizer2类。 Example usage in Java和related test。
请注意,通过将C库包装在icu.net项目中,需要将ICU功能移植到.NET。现在,there is no Normalizer2 class,但我不认为实施它需要付出很多努力。