Как правильно заглавные греческие слова в .NET?

У нас есть приложение ASP.NET, в котором работают разные клиенты по всему миру. В этом приложении у нас есть словарь для каждого языка. В словаре у нас есть слова в нижнем регистре, а иногда мы заглавем его в коде по типовым причинам.

var greek= new CultureInfo("el-GR");
string grrr = "Πόλη";
string GRRR = grrr.ToUpper(greek); // "ΠΌΛΗ"

Проблема заключается в следующем:

... если вы используете заглавные буквы то они должны выглядеть так: f.e. ΠΟΛΗ, а не как ΠΌΛΗ, то же самое для всех другие слова, написанные заглавными буквами

Итак, возможно ли в общих чертах правильно заглавные греческие слова в .NET? Или я должен написать собственный собственный алгоритм для греческого прописного слова?

Как они решают эту проблему в Греции?

Ответ 1

Я подозреваю, что вам придется писать свой собственный метод, если el-GR не делает то, что вы хотите. Не думайте, что вам нужно перейти во всю длину создания пользовательской CultureInfo, если это все, что вам нужно. Это хорошо, потому что это выглядит довольно нерешительно.

Что я предлагаю вам сделать, так это читать это сообщение в блоге Михаэля Каплана и все остальное, что вы можете найти от него - он работает над и писать о i18n и языковых проблемах годами и годами, а его комментарий - моя первая точка вызова для любых таких проблем в Windows.

Ответ 2

Я мало что знаю об ASP.Net, но я знаю, как это сделать на Java.

Если символы Unicode, я просто выполнил бы пост-обработку вывода из ToUpper с помощью некоторых простых подстановок, одним из которых является преобразование \u038C (Ό) в \u039F (Ο) или \u0386 (Ά) до \u0391 (Α).

Из взглядов греческой/коптской кодовой страницы (\ u0370 через \u03ff) осталось всего несколько символов (6 или 7).

Ответ 4

Как насчет замены неправильных символов правильными:

/// <summary>
/// Returns the string to uppercase using Greek uppercase rules.
/// </summary>
/// <param name="source">The string that will be converted to uppercase</param>
public static string ToUpperGreek(this string source)
{
    Dictionary<char, char> mappings = new Dictionary<char, char>(){
        {'Ά','Α'}, {'Έ','Ε'}, {'Ή','Η'}, {'Ί','Ι'}, {'Ό','Ο'}, {'Ύ','Υ'}, {'Ώ','Ω'}
    };

    source = source.ToUpper();

    char[] result = new char[source.Length];
    for (int i = 0; i < result.Length; i++)
    {
        result[i] = mappings.ContainsKey(source[i]) ? mappings[source[i]] : source[i];
    }

    return new string(result);
}