【问题标题】:Convert a string to ordinal upper or lower case将字符串转换为序数大写或小写
【发布时间】:2017-05-18 21:30:27
【问题描述】:

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

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 如何实现?

编辑: 如何获得序数字符串表示?同样,如何获得不变的字符串表示?也许这是不可能的,因为在上述情况下它可能是模棱两可的,至少对于序数表示。

编辑2:

string.Equals("ß", "ss", StringComparison.InvariantCultureIgnoreCase); // true

但是

"ß".ToLowerInvariant() == "ss"; // false

【问题讨论】:

  • @diiN__________ 我不认为扩展方法的想法是 OP 需要帮助的。他们只是不知道这种方法的代码应该是什么。
  • 我不是在询问扩展方法或字符串比较。仅如何获取序数字符串表示。
  • 没有序号字符串 respresentation 因为序号比较意味着“比较每个字节”。
  • @TimSchmelter 那么为什么存在 StringComparison.OrdinalIgnoreCase,哪些字节区分大小写?
  • @Wouter 因为它首先将它们转换为大写。来自the docs OrdinalIgnoreCase 属性返回的TheStringComparer 将要比较的字符串中的字符视为使用不变区域性的约定转换为大写

标签: c# string uppercase lowercase ordinal


【解决方案1】:

我认为 .NET Framework 或 .NET Core 中不存在此功能。最接近的是string.Normalize(),但它缺少成功完成此操作所需的案例折叠选项。

此功能存在于ICU project(在 C/Java 中可用)。您所追求的功能是 C 中的 unorm2.h 文件或 Java 中的 Normalizer2 类。 Example usage in Javarelated test

据我所知,Normalizer2 的 2 个实现已移植到 C#:

  • icu-dotnet(ICU4C 的 C# 包装库)
  • ICU4N(ICU4J 的全托管端口)

完全披露:我是 ICU4N 的维护者。

【讨论】:

  • 感谢,对于这个添加,从我在 msdn 上的红色来看,Normalize 不会改变大小写,只会对许多等效的二进制表示进行规范化。我还发现 unicode 00df 和 1e9e 是相关的。但不知何故 1e9e 不是 00df 的大写。请参阅:fileformat.info/info/unicode/char/00df/index.htmfileformat.info/info/unicode/char/1e9e/index.htm
  • 是的,这就是为什么我提到它在我的回答中并不完全符合标准。为了使它像这样工作,需要调用 ICU unorm2.h。最好在 Java Normalizer2 类之后对 API 进行建模并将其放入 icu.net 项目中,以便所有人都可以使用。
【解决方案2】:

来自msdn

OrdinalIgnoreCase 属性返回的StringComparer 将要比较的字符串中的字符视为使用不变区域性的约定转换为大写,然后执行与语言无关的简单字节比较。

但我猜这样做不会达到你想要的效果,因为简单地执行 "ß".ToUpperInvariant() 不会给你一个通常等同于 "ss" 的字符串。在处理Why “ss” equals 'ß' 的特殊情况的 String.Equals 方法中一定有一些魔力。

如果您只担心德语文本,那么this answer might help

【讨论】:

    猜你喜欢
    • 2016-01-22
    • 2018-09-07
    • 2014-03-30
    • 2010-11-04
    • 2010-10-09
    • 2022-01-19
    • 1970-01-01
    • 2020-12-05
    相关资源
    最近更新 更多