为什么string.Compare似乎不一致处理重音的字符?
-
21-09-2019 - |
题
如果我执行以下语句:
string.Compare("mun", "mün", true, CultureInfo.InvariantCulture)
结果是“-1”,表明“门”具有比“门”的数值低。
然而,如果我执行此语句:
string.Compare("Muntelier, Schweiz", "München, Deutschland", true, CultureInfo.InvariantCulture)
我得到 '1',表明 '曼泰利耶,Schewiz' 应该去最后
这是在比较的错误?或者,更可能的是有规则我应该排序包含字符串时,可以考虑到重音的
究其原因,这是一个问题,我在整理列表,然后这样做的意思让每一个字符串包含“xxx”开头的手动二元过滤器。
以前我用的是Linq的“去哪儿”的方法,但现在我必须用另一个人写了这个自定义函数,因为他说,它的性能会更好。
但自定义功能似乎并没有考虑到任何“统一”的规则.NET了。所以,如果我告诉它通过“门”过滤器,它没有找到任何物品,即使有列表中的项目与“门”开始的。
这似乎是因为重音字符不一致排序,根据不同的重音字符后去什么字。
OK,我想我已经解决了这一问题。
的过滤器之前,我做基于所述第一排序名词的每个字符串,字母其中名词的是搜索字符串的长度。
解决方案
有是在工作平局决胜算法,请参阅 http://unicode.org/reports/tr10/
要解决的复杂性 语言敏感的排序中, 多层次比较算法是 采用。在比较两个词,对于 例如,最重要的特点是 基本字符:如 一个A和B之间的差异 雅绅特的差异通常是 忽略,如果有任何差异 在基本字母。案例差异 (大写与小写),是 通常被忽略,如果有任何 在基或修饰的差异。 标点符号是可变的。在一些 情况下一个标点符号是 像基字符处理。在 其他情况下,它应该被忽略 如果有任何碱,口音,或壳体 差异。也有可能是 最后,领带破水平,因此如果 有没有其他差别可言 在串,(归一化)码 点顺序被使用。
所以, “Munt ...” 和 “Münc...” 是按字母顺序不同和排序基于 “T” 和 “c”。
然而,“门”和“门”是按字母顺序相同(“U” equivelent在失去语言为“U”),以使字符代码相比较
其他提示
它看起来像只被在一种“抢七”的情况中使用的重音字符 - 换句话说,如果字符串是否则等于
。下面是一些示例代码来演示:
using System;
using System.Globalization;
class Test
{
static void Main()
{
Compare("mun", "mün");
Compare("muna", "münb");
Compare("munb", "müna");
}
static void Compare(string x, string y)
{
int result = string.Compare(x, y, true,
CultureInfo.InvariantCulture));
Console.WriteLine("{0}; {1}; {2}", x, y, result);
}
}
(我一直在尝试,“N”后加空格为好,看它是否是在字边界做了 - 它不是)
结果:
mun; mün; -1
muna; münb; -1
munb; müna; 1
我怀疑这是由各种复杂的Unicode规则正确的 - 但我不知道有足够的了解他们。
。至于是否需要考虑这一点......我不希望这样。你在做什么是由该抛?
据我了解这一点,仍然有些一致。当使用CultureInfo.InvariantCulture
比较元音变音字符ü
被当作非重音字符u
。
如在第一个实施例的字符串明显是不相等的结果将不会是0,但-1(这似乎是一个默认值)。在第二个例子的曼泰利耶进入最后因为吨如下的 C 的字母表中。
我无法找到任何MSDN文档清晰解释这些规则,但我发现
string.Compare("mun", "mün", CultureInfo.InvariantCulture,
CompareOptions.StringSort);
和
string.Compare("Muntelier, Schweiz", "München, Deutschland",
CultureInfo.InvariantCulture, CompareOptions.StringSort);
给出所需的结果。
无论如何,我认为你会是好到你的基础上的特定文化排序,如当前用户的文化(如果可能)。