![](/img/trans.png)
[英]Culture-Invariant case-sensitive string comparison returns different results on different machines
[英]How to put strings into culture-invariant buckets?
我的應用程序需要處理可能包含重音符號的字符串。 我需要能夠將這些名稱分為不同的字母桶。
我原本以為在.Net中使用CultureInvariant字符串比較,但是這樣做有兩個問題:
它實際上並不會說字母C與C cedilla相同,但是我需要這種相等性。
WinRT的.Net版本在任何地方都沒有CultureInvariant作為選項。
誰能建議一個算法或至少一個我可以用來嘗試將不同字母組合在一起的起點?
謝謝。
有一個代碼 (由Michael S. Kaplan創建,並在很多文章中都提到了),該代碼可以解決大多數情況:
static string RemoveDiacritics(string stIn)
{
string stFormD = stIn.Normalize(NormalizationForm.FormD);
StringBuilder sb = new StringBuilder();
for (int ich = 0; ich < stFormD.Length; ich++)
{
UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
if (uc != UnicodeCategory.NonSpacingMark)
{
sb.Append(stFormD[ich]);
}
}
return (sb.ToString().Normalize(NormalizationForm.FormC));
}
我用Ç/ C和帶有/不帶有重音符號的字母對其進行了測試,並且效果很好(即使使用撇號也可以)。 無論如何,您可能必須使用基於字典的方法或一組條件/切換...案例來對此進行補充,以解決所有可能出現的情況。 例如:
if (inputString.Contains("ß"))
{
inputString = inputString.Replace("ß", "ss");
}
這篇文章, WinRT中是否有String.Normalize()替代方法? ,其解決方案已被標記為答案。 我還沒有測試過,但是會在這里發表評論。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.