【问题标题】:ToLower vs ToLowerInvariantToLower vs ToLowerInvariant
【发布时间】:2015-06-11 10:28:57
【问题描述】:

我只是在寻找这两种方法产生不同结果的任何例子。首先,我访问msdn page,并从中运行代码并稍作改动

using System;
using System.Globalization;
using System.Linq;

class Program
{
    static void Main()
    {
        string[] words = { "Tuesday", "Salı", "Вторник", "Mardi", 
                         "Τρίτη", "Martes", "יום שלישי", 
                         "الثلاثاء", "วันอังคาร" };
        Console.BufferHeight = 1000;
        var test = CultureInfo.GetCultures(CultureTypes.AllCultures)
                              .Select(ci =>
                                      {
                                          string[] wordsToLower = words.Select(x => x.ToLower(ci)).ToArray();
                                          string[] wordsToLowerInvariant = words.Select(x => x.ToLowerInvariant()).ToArray();
                                          return new
                                                 {
                                                     Culture = ci,
                                                     ToLowerDiffers = !wordsToLower.SequenceEqual(wordsToLowerInvariant)
                                                 };
                                      })
                              .ToArray();
        foreach (var x in test)
        {
            Console.WriteLine("Culture {0}, ToLower and ToLowerInvariant produces different results: {1}", x.Culture, x.ToLowerDiffers);
        }
        Console.WriteLine();
        Console.WriteLine("Difference exists for any ToLower call: {0}", test.Any(x => x.ToLowerDiffers));
    }
}

但我有一个问题:此代码在所有现有文化中为 ToLowerToLowerInvariant 调用生成相同的输出。

所以问题是:有没有任何字符串会为这个测试产生不同的结果?

【问题讨论】:

标签: c# .net localization globalization cultureinfo


【解决方案1】:

试试土耳其语点缀İ

var culture = new CultureInfo("tr-TR");

string test = "İ";

if (test.ToLower(culture) == test.ToLowerInvariant())
    Console.WriteLine("Same");
else
    Console.WriteLine("Different"); // Prints this!

【讨论】:

  • 更具体地说,如果用户的文化是土耳其语,则正常的 ASCII 'i' 大写为一个大点的 'İ'。如果您不想要这种行为,请通过指定不同的文化来避免它,例如不变的文化。
【解决方案2】:

xxxInvariant 假定文化设置为默认值。为了能够显示差异,您应该使用与设置中的默认文化不同的文化信息来演示 ToLower 和 ToLowerInvariant。并且默认情况下,默认文化是系统文化。

因此,如果您的系统文化是 en-US 并且您在代码中仅使用 en-US 字符,则 ToLower 和 ToLowerInvariant 将给出相同的结果。

据我所知,如果您在 ToLowerInvariant 之后将“Salı”更改为“SALI”,您应该得到“Sali”。

【讨论】:

  • 他正在调用 ToLower() 的覆盖,它采用 CultureInfo
  • 你可能错了? String.ToLower() 使用默认区域性,而 String.ToLowerInvariant() 使用不变区域性。所以你本质上是在问不变文化和序数字符串比较之间的区别。 stackoverflow.com/a/6225872/742084
猜你喜欢
  • 2015-10-13
  • 1970-01-01
  • 2011-10-03
  • 2013-09-10
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 2017-05-05
相关资源
最近更新 更多