C# 字符串数组 orderBy 重音字符问题

Posted

技术标签:

【中文标题】C# 字符串数组 orderBy 重音字符问题【英文标题】:C# string array orderBy problem with accent characters 【发布时间】:2020-11-05 07:57:18 【问题描述】:

我写了一个小代码来声明一个字符串数组,我尝试使用和不使用 stringCompare 对其进行排序,但结果始终相同。

在我使用cultureInfo的地方使用StringComparer:

var strings = new string[]  "asd", "ásd", "álm", "alm" ;
var ci = CultureInfo.GetCultureInfo("hu");
var comp = StringComparer.Create(ci, false);
Console.WriteLine(string.Join(", ", strings.OrderBy(item => item, comp)));

没有StringComparer:

var strings = new string[]  "asd", "ásd", "álm", "alm" ;
Console.WriteLine(string.Join(", ", strings.OrderBy(item => item)));

两个结果都是:

alm, álm, asd, ásd

但正确的结果是:

alm, asd, álm, ásd

我做错了什么?

【问题讨论】:

我不会匈牙利语,但似乎使用了不同的排序规则。 Wikipedia 说 a 和 á 是共同排序的:“虽然带有变音符号的字符被认为是单独的字母,但在排序单词时,仅长度不同的元音被视为相同。因此,例如,对 O/Ó 和Ö/Ő在排序上没有区别,但Ö跟在O之后。”。 OTOH,SQL Server 有超过 100 个匈牙利语排序规则。 您可以回答自己的问题,而不是将解决方案添加到您的答案中。 感谢您的正确评论。我修改了它:) 【参考方案1】:

你可以只使用Ordinal字符串比较

var strings = new[]  "asd", "ásd", "álm", "alm" ;
Console.WriteLine(string.Join(", ", strings.OrderBy(item => item, StringComparer.Ordinal)));

它给你

alm, asd, álm, ásd

【讨论】:

这重现了 OP 给出的示例,但我仍然不确定 Péter 的“正确结果”究竟是什么意思:一些不同的词汇排序或序数排序。 @KlausGütter 是的,正如你所写。序数比较并不能解决我的问题。匈牙利语 ABC 看起来像这样:a-á-b-c..... 序数比较器从字符串中生成:alm、asd、álm、ásd。但是如果我添加一个新的字符串示例:“bab”,那么结果将是:alm, asd, bab, álm, ásd 找到了解决方案。更新了我的问题。谢谢你们的帮助【参考方案2】:

我想我找到了解决方案。如果我将全球 CurrentCulture 设置为“hu”或“hu-HU”,那么单词不会以正确的顺序显示,但我发现了一个额外的匈牙利文化:“hu-HU_technl”。

链接:https://docs.microsoft.com/hu-hu/windows/win32/intl/sort-order-identifiers?redirectedfrom=MSDN

代码:

CultureInfo ci = CultureInfo.GetCultureInfo("hu-HU_technl");
Thread.CurrentThread.CurrentCulture = ci;
var strings = new string[]  "brummm", "asd", "ásd", "álm", "alm" ;
Console.WriteLine(string.Join(", ", strings.OrderBy(item => item)));

结果:alm, asd, álm, ásd, brummm

您也可以使用 StringComparer 来达到此目的:

CultureInfo ci = CultureInfo.GetCultureInfo("hu-HU_technl");
var comp = System.StringComparer.Create(ci, false);
var strings = new string[]  "brummm", "asd", "ásd", "álm", "alm" ;
Console.WriteLine(string.Join(", ", strings.OrderBy(item => item, comp)));

【讨论】:

以上是关于C# 字符串数组 orderBy 重音字符问题的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有无效字符(重音)的 Pandas 数据框与数组匹配? [复制]

使用 .NET 如何将包含 Latin-1 重音字符的 ISO 8859-1 编码文本文件转换为 UTF-8

无法使用php读取数组中的重音名称[重复]

MySQL 触发器使用值数组替换重音/不需要的变量

Outlook 无法在我的 mailto 字符串中接受法语重音字符?

不同字符串长度的C#字谜?