将字符串转换为序数大写或小写

时间:2017-01-04 14:35:59

标签: c# string uppercase lowercase ordinal

是否可以将字符串转换为序数大写或小写。类似于不变量。

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

2 个答案:

答案 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 Javarelated test

请注意,通过将C库包装在icu.net项目中,需要将ICU功能移植到.NET。现在,there is no Normalizer2 class,但我不认为实施它需要付出很多努力。