我在土耳其有一个客户,最近有一个问题,他不能使用我们的组件之一。该组件是用C#.Net 2.0编写的,并使用具有多列的DataTable
。如果我通过计算机上的名称(Region Germany和Language German)访问列,则该组件有效。如果我在土耳其语计算机(Region Turkey和Türkçe语言)上执行组件,它将无法正确执行。
我将问题缩小到区分大小写。如果我按名称访问列,并且名称用大写字母而不是小写字母写,那么它在土耳其计算机上将失败。对我来说奇怪的是,它不会在我的计算机上失败。两台机器都是Windows 10。
我创建了一个示例来使此问题可重现。
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());
结果为:
在土耳其语中,大写字母“ I”的toLower()似乎不同于其他语言。
答案 0 :(得分:1)
尝试使用土耳其语区域设置在字符串“ compID”上创建toLower()。如果返回“ compID”,则区分大小写的türkisch不同于西欧。实际上我无法检查它,因为我这里没有电脑。