Я работаю с .NET 8 и столкнулся с проблемой преобразования символов в тексте на турецком языке. Согласно правилам турецкого языка, при преобразовании прописной буквы «I» в строчную она должна превратиться в «ı». Однако в моем приложении .NET 8 вместо этого оно преобразует «İ» в «i». Как я могу гарантировать, что .NET 8 правильно обрабатывает это преобразование в «ı»?
.Net 8
var toLower = "Iı".ToLower();
// Output
// iı
.NET Framework 4.7
var toLower = "Iı".ToLower();
// Output
// ıı
Ваше описание относится к İ
, но в ваших фрагментах кода используется I
; это намеренно?
На мой взгляд, ведет себя правильно dotnetfiddle.net/oTSz3p
Чтобы обеспечить правильную обработку текста на турецком языке, вы можете использовать что-то вроде: var culture = new CultureInfo("tr-TR"); var toLower = "Iı".ToLower(culture);
— но, вероятно, будет полезно сначала прочитать об обработке культуры .NET.
.NET работает правильно, и культура актуальна. Результаты .NET 8 означают, что Thread.CurrentCulture
не является турецким. Мало того, что это можно повторить, турецкий I
является самым известным примером различий между культурами в Юникоде. Фактически, настоящая буква — это I без точки, которая используется в других культурах, в том числе. Буква I
— это старая добрая I
, встречающаяся в 7-битном диапазоне US-ASCII. ToLower()
использует культуру потока по умолчанию.
@PanagiotisKanavos - К вашему сведению, ваша ссылка неверна, вот правильная: en.wikipedia.org/wiki/Dotless_I
Используйте CultureInfo("tr-TR")
в .NET 8 для преобразования.
См. код ниже:
using System;
using System.Globalization;
class Program
{
static void Main()
{
var turkishCulture = new CultureInfo("tr-TR");
var text = "Iı";
var toLower = text.ToLower(turkishCulture);
Console.WriteLine(toLower); // Output: ıı
}
}
См. рабочий .netfiddle здесь
Или просто используйте Thread.CurrentThread.CurrentCulture =CultureInfo.GetCultureInfo("tr-TR")
. Текущая культура явно не tr-TR
и ее необходимо настроить.
Реализация этих двух методов в .NetFemeWork
и .Net
похоже, как показано ниже, оба используют CurrentCulture
в .Net
public string ToLower(CultureInfo? culture)
{
CultureInfo cult = culture ?? CultureInfo.CurrentCulture;
return cult.TextInfo.ToLower(this);
}
в .NetFrameWork
public string ToLower()
{
return ToLower(CultureInfo.CurrentCulture);
}
Если вы хотите явно указать, какую культуру использовать, код будет следующим:
var toLower = "Iı".ToLower(new CultureInfo("tr-TR"));
Или просто используйте Thread.CurrentThread.CurrentCulture =CultureInfo.GetCultureInfo("tr-TR")
.
В какой культуре работает ваш код?