String StartsWith () проблема с датским текстом - PullRequest
3 голосов
/ 30 июня 2011

Может кто-нибудь объяснить это поведение?

var culture = new CultureInfo("da-DK");
Thread.CurrentThread.CurrentCulture = culture;
"daab".StartsWith("da"); //false

Я знаю, что это можно исправить, указав StringComparison.InvariantCulture.Но я просто сбит с толку поведением.

Я также знаю, что «aA» и «AA» не считаются одинаковыми в датском сравнении без учета регистра, см. http://msdn.microsoft.com/en-us/library/xk2wykcz.aspx. Это объясняет

String.Compare("aA", "AA", new CultureInfo("da-DK"), CompareOptions.IgnoreCase) // -1 (not equal)

Это связано с поведением первого фрагмента кода?

Ответы [ 2 ]

6 голосов
/ 01 июля 2011

Здесь тест, иллюстрирующий проблему, daab og dåb (то же самое слово в старом и современном языках соответственно) означает крещение / крещение.

public class can_handle_remnant_of_danish_language
{
    [Fact]
    public void daab_start_with_då()
    {
        var culture = new CultureInfo("da-DK"); Thread.CurrentThread.CurrentCulture = culture;
        Assert.True("daab".StartsWith("då")); // Fails
    }

    [Fact]
    public void daab_start_with_da()
    {
        var culture = new CultureInfo("da-DK"); Thread.CurrentThread.CurrentCulture = culture;
        Assert.True("daab".StartsWith("da")); // Fails
    }

    [Fact]
    public void daab_start_with_daa()
    {
        var culture = new CultureInfo("da-DK"); Thread.CurrentThread.CurrentCulture = culture;
        Assert.True("daab".StartsWith("daa")); // Succeeds
    }

    [Fact]
    public void dåb_start_with_daa()
    {
        var culture = new CultureInfo("da-DK"); Thread.CurrentThread.CurrentCulture = culture;
        Assert.True("dåb".StartsWith("daa")); // Fails
    }

    [Fact]
    public void dåb_start_with_da()
    {
        var culture = new CultureInfo("da-DK"); Thread.CurrentThread.CurrentCulture = culture;
        Assert.True("dåb".StartsWith("da")); // Fails
    }

    [Fact]
    public void dåb_start_with_då()
    {
        var culture = new CultureInfo("da-DK"); Thread.CurrentThread.CurrentCulture = culture;
        Assert.True("dåb".StartsWith("då")); // Succeeds
    }
}

Все вышеперечисленные тесты должны быть успешными с моим пониманием языка, и я датский! Я не получил никакой степени в грамматике, хотя. : -)

Мне кажется, что это ошибка.

5 голосов
/ 30 июня 2011

Как сказал Nappy, это особенность датского языка, где «aa» и «å» - это то же самое.Даниш получил еще две буквы, æ и ø, но я не уверен, можно ли их также написать двумя буквами.

Я думаю, что во втором примере «aA» не изменяется, а «AA» изменяетсяв "Å".Просто чтобы еще больше запутать, «Aa» считается равным «AA» и «aa» только при использовании сравнения без учета регистра.

...