土耳其的 DataTable 列区分大小写

DataTable Column CaseSensitive in Turkey

我有一位土耳其客户最近遇到问题,他无法使用我们的某个组件。该组件是用 C# .Net 2.0 编写的,并使用具有多个列的 DataTable。如果我在我的计算机上按名称访问列(德国地区和德语语言),则该组件可以工作。如果我在土耳其计算机(土耳其地区和语言 Türkçe)上执行该组件,它无法正确执行。

我将问题缩小到区分大小写。如果我按名称访问列并且名称是用大写字母而不是小写字母书写的,那么它在土耳其计算机上会失败。对我来说奇怪的是,它不会在我的电脑上失败。两台机器都是Windows10.

我创建了一个示例来重现这个问题。

class Program
{
    static void Main(string[] args)
    {
        DataSet set = GetDataSet();
        try
        {
            foreach (DataRow row in set.Tables[0].Rows)
            {
                String Directory = string.Format("{0}", row["component"]);
                String FileName = row["name"].ToString();
                String compBig = String.Format("{0}", row["compId"]); //here is the problem. I wrote the compId with an uppercase I instead of i

                String component = String.Format("{0}", row["component"]);
                String name = row["name"].ToString();
                String compSmall = row["compid"].ToString();
            }  
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.ReadLine();

    }

    private static DataSet GetDataSet()
    {
        DataSet set = new DataSet();

        DataTable workTable = new DataTable("Table0");

        workTable.Columns.Add("component", typeof(int));
        workTable.Columns.Add("name", typeof(String));
        workTable.Columns.Add("compid", typeof(Guid)); //Here is the compid with a lowercase i

        DataRow row = workTable.NewRow();
        row["component"] = 0;
        row["name"] = "AName";
        row["compid"] = Guid.NewGuid();

        workTable.Rows.Add(row);
        set.Tables.Add(workTable);
        return set;
    }
}

异常如下:

我的问题是:为什么在一种情况下区分大小写而在另一种情况下不区分大小写?

我暂时解决了这个问题,方法是将大写的 I 更改为小写的 i(从一开始就应该这样做)

--- 更新: ---

我现在已经尝试了几个 cultureInfos

        CultureInfo culture;
        //uncomment to test
        culture = CultureInfo.CreateSpecificCulture("tr-TR"); //turkish fails
        //culture = CultureInfo.CreateSpecificCulture("he-IL"); //Hebrew works
        //culture = CultureInfo.CreateSpecificCulture("ar-SA"); //Arabic works
        //culture = CultureInfo.CreateSpecificCulture("en-GB"); //English works
        //culture = CultureInfo.CreateSpecificCulture("ru-RU"); //Russian works
        //culture = CultureInfo.CreateSpecificCulture("de-DE"); //German works
        Thread.CurrentThread.CurrentCulture = culture;
        Thread.CurrentThread.CurrentUICulture = culture;

到目前为止,土耳其语似乎是唯一失败的语言。

--- 更新 ---

我尝试了以下方法:

        culture = CultureInfo.CreateSpecificCulture("tr-TR"); //turkish fails
        Thread.CurrentThread.CurrentCulture = culture;
        Thread.CurrentThread.CurrentUICulture = culture;

        String ID = "ID";
        String idLower = "id";

        Console.WriteLine(ID.ToLower());
        Console.WriteLine(idLower.ToUpper());

        culture = CultureInfo.CreateSpecificCulture("el-GR"); //Greek works
        Thread.CurrentThread.CurrentCulture = culture;
        Thread.CurrentThread.CurrentUICulture = culture;

        Console.WriteLine(ID.ToLower());
        Console.WriteLine(idLower.ToUpper());

这导致:

似乎大写字母的 toLower() "I" 在土耳其语中与在其他语言中有所不同。

尝试使用土耳其语区域设置在字符串 "compID" 上创建一个 toLower()。如果它 returns "compID" 区分大小写的 türkisch 不同于西欧的区分大小写。其实我查不到,因为我这里没有电脑