土耳其的 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 不同于西欧的区分大小写。其实我查不到,因为我这里没有电脑
我有一位土耳其客户最近遇到问题,他无法使用我们的某个组件。该组件是用 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 不同于西欧的区分大小写。其实我查不到,因为我这里没有电脑