簡體   English   中英

將字符串轉換為有序大寫或小寫

[英]Convert a string to ordinal upper or lower case

是否可以將字符串轉換為序數大寫或小寫。 類似不變量。

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

我認為 .NET Framework 或 .NET Core 中不存在此功能。 最接近的是string.Normalize() ,但它缺少成功完成此操作所需的 case fold 選項。

此功能存在於ICU 項目中(可在 C/Java 中使用)。 您所追求的功能是 C 中的unorm2.h文件或 Java 中的Normalizer2類。 Java相關測試中的示例用法

我知道有 2 個Normalizer2實現已移植到 C#:

  • icu-dotnet (ICU4C 的 C# 包裝庫)
  • ICU4N (ICU4J 的完全托管端口)

完全披露:我是 ICU4N 的維護者。

msdn

OrdinalIgnoreCase 屬性返回的StringComparer 將要比較的字符串中的字符視為使用不變區域性的約定將它們轉換為大寫,然后執行獨立於語言的簡單字節比較。

但我猜這樣做不會達到你想要的效果,因為簡單地執行 "ß".ToUpperInvariant() 不會給你一個通常等同於 "ss" 的字符串。 String.Equals 方法中一定有一些魔法來處理為什么“ss”等於 'ß'的特殊情況。

如果您只擔心德語文本,那么此答案可能會有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM