"aaaa".StartsWith("aaa") returns false

18

如果这不是一个 bug,那么有人可以解释一下这种行为背后的原因吗?实际上,似乎每个奇数长度的单词都会返回 false:

string test = "aaaaaaaaaaaaaaaaaaaa";
Console.WriteLine(test.StartsWith("aa"));
Console.WriteLine(test.StartsWith("aaa"));
Console.WriteLine(test.StartsWith("aaaa"));
Console.WriteLine(test.StartsWith("aaaaa"));
Console.WriteLine(test.StartsWith("aaaaaa"));
Console.WriteLine(test.StartsWith("aaaaaaa"));
执行在丹麦系统上时,会产生以下输出:
True
False
True
False
True
False

3
我不相信这是真的。举个例子,在 Ideone 上,not 可能是一个“Culture” 的东西。 - Soner Gönül
1
我已经将你的代码片段复制并粘贴到LINQPad中 - 每一行都返回了true - Patryk Ćwiek
1
你是怎么做到的?我复制了你的代码,结果全部都是“True”。 - Alexander Tsvetkov
2
@Matthew 好吧,你肯定会同意文化在这里是非常关键的信息,即使有适当的文化,Mono也不会复制这种行为。但是,是的,那真是令人失望。 - Konrad Rudolph
Matthew是对的,我在发布问题后立即发现了这一点。在丹麦语中,aa对应于“å”,因此每个奇数个a都会返回false。通过不变的文化进行比较可以解决这个问题 :) - sondergard
显示剩余3条评论
1个回答

22

这肯定是由于你当前的文化背景所致。你可能处于丹麦文化中,其中aa被认为是一个字母。如果你尝试更改文化或大小写,则应该可以解决。

我记得在匈牙利文化和字母关联方面有类似的行为。

请参阅与丹麦文本一起使用String.StartWith()方法的问题

示例:

using System;
using System.Globalization;

namespace Demo
{
    public static class Program
    {
        public static void Main(string[] args)
        {
            System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("da-DK");
            System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
            string test = "aaaaaaaaaaaaaaaaaaaa";
            Console.WriteLine(test.StartsWith("aa"));
            Console.WriteLine(test.StartsWith("aaa"));
            Console.WriteLine(test.StartsWith("aaaa"));
            Console.WriteLine(test.StartsWith("aaaaa"));
            Console.WriteLine(test.StartsWith("aaaaaa"));
            Console.WriteLine(test.StartsWith("aaaaaaa"));
        }
    }
}

这将打印原帖中所述内容。


4
在执行他的代码之前,使用Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("hu-hu");仍然会导致所有行输出True - Daniel Hilgarth
抱歉,这是丹麦语。请尝试设置Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("da-DK"); - Kek
但实际上,丹麦语产生了期望的 - 或者更准确地说是 意外的 - 结果,即 Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("da"); - Daniel Hilgarth
仍无法在Mono上工作,但这可能是由于缺乏区域设置支持。不过,您能否更详细地解释一下为什么会出现这种行为?尽管我对Unicode、编码和区域有基本的了解,但我仍然不理解。 - Konrad Rudolph
3
在丹麦语中,“aa”对应于单个字母“å”,这就是为什么每个奇数数量的“a”会导致错误的原因。 :) - sondergard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接