如何将"ß"与 ASP Net Core 5.0 项目中的"ss"进行比较?



我有一个ASP。Net Core项目。我使用ASP。Net Core版本5.0我的母语是德语,因此我们的数据库中也充满了德语单词,例如单词";fußball;(意思是足球或足球,取决于你来自哪里(。

正如你所看到的,这个词有一个ß。在德语中,这个";ß";基本上等同于";ss";。因此,如果我有字符串";fußball;如果有人搜索";fussball";而且

我知道ASP。Net Core有很好的本地化和全球化选项,我只是不明白这一点。

考虑以下代码:

var currCulture = CultureInfo.CurrentCulture.Name; // = "de-AT"
var str1 = "fußball";
str1.StartsWith("fuss"); //returns false
str1.StartsWith("fuss", StringComparison.InvariantCulture); //returns false
String.Equals("ß", "ss", StringComparison.InvariantCulture); //returns false

由于我使用英语的Windows PC,并且我在另一个Stackloverflow问题中读到CultureInfo依赖于操作系统,因此我决定将以下内容插入我的Startup.cs-文件中,正如这个Stackloverload问题中所建议的那样

var cultureInfo = new CultureInfo("de-AT"); //de-AT for Austria, i tried with de-DE too for germany, but the result was the same
cultureInfo.NumberFormat.CurrencySymbol = "€";
CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;

不幸的是,对于我当前的设置,它总是告诉我";ß";以及";ss";在字符串中进行比较时不相同。";ä"以及";ae";,但我需要以同样的方式找到这些。不管输入是否为"0";ä"ae";或";ß"/"ss";。

我们非常感谢任何关于我做错了什么的想法,我只是似乎无法让它发挥作用。

提前感谢您&顺致敬意,

。NET Core在Windows上使用了操作系统内置的NLS本地化库,而其他操作系统则使用了跨平台和标准兼容的ICU库。因为NLS和ICU在实现上不同,这意味着相同。NET核心程序在比较字符串时,可以在不同的平台上产生不同的结果。

为了防止这种混淆,来自。NET 5决定在包括Windows在内的所有平台上使用ICU。然而,由于许多应用程序(包括您的应用程序(都是在Windows上编写的,因此假设字符串比较以NLS方式工作,因此需要做一些事情才能使它们在ICU中按预期工作。

在您的情况下,您可以显式设置CurrentCulture,然后确保在字符串比较中显式使用它:

using System.Globalization;
CultureInfo.CurrentCulture = new CultureInfo("de-AT", false);
Console.WriteLine($"CurrentCulture is {CultureInfo.CurrentCulture.Name}.");
string first = "Sie tanzen auf der Straße.";
string second = "Sie tanzen auf der Strasse.";
bool b = string.Equals(first, second, StringComparison.CurrentCulture);
Console.WriteLine($"The two strings {(b ? "are" : "are not")} equal.");
// CurrentCulture is de-AT.
// The two strings are equal.

如果ICU对您的应用程序造成太多问题,通过在.csproj中放置以下内容,您可以恢复到NLS,但这只能在您升级代码以使用ICU时使用:

<ItemGroup>
<RuntimeHostConfigurationOption Include="System.Globalization.UseNls" Value="true" />
</ItemGroup>

正如@chadnt的回答所描述的那样,NET5引入了一个导致此问题的突破性更改。

在这里,我找到了另一个解决方案,它甚至可以与NET6/7一起使用。

string sb = "ß";
string ss = "ss";
StringComparer sc1 = StringComparer.Create(CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace);
Console.WriteLine(sc1.Compare(sb, ss));
//returns 0 - zero means sb a ss are equal; 

最新更新