Строка греческих символов в нижний регистр - PullRequest
0 голосов
/ 08 декабря 2018

У меня возникли проблемы с преобразованием строки "SΨZΣ" в нижний регистр.

В C # оба .ToLower () и .ToLowerInvariant () дают мне "sψzσ" в качестве результата.Хотя javascript возвращает «sψzψ».

После некоторого исследования я думаю, что понял, что символ «Σ» следует переводить в «σ», только если он не находится в конце слова, и в этом случае он долженбыть превращенным в 'ς' - так что версия javascript в порядке.И действительно, я получаю ошибки при вызове внешнего API со строкой C #, в то время как строка js работает нормально.

Есть идеи о том, как я могу сделать C #, чтобы корректно опустить строку?

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

К сожалению, в C # нет способа сделать это по умолчанию;Сначала, когда я посмотрел на ваш вопрос, я догадался, что это может быть что-то, что может исправить установка культуры, например:

string s = "SΨZΣ".ToLower(new CultureInfo("el-GR"));

, но, к сожалению, это не работает.Проблема более сложная, и поэтому мы должны принять собственное решение:

    public string GreekToLower(string s)
    {
        string lowerString = s.ToLower();

        // Matches any 'σ' followed by whitespace or end of string
        string returnString = Regex.Replace(lowerString, "σ(\\s+|$)", "ς$1");
        return returnString;
    }

Это строчные буквы вашей строки, а затем поиск любого символа «σ», за которым следует один или несколько пробелов или происходит вконец строки (последнее слово в вашей строке, скорее всего, не будет сопровождаться пробелом), а затем заменяет его на «ς», сохраняя все существующие пробелы, которые он находит.

Regex, вероятно, лучше всего подходит для этихтипы сценариев.Я предполагаю, что вы, вероятно, также захотите убедиться, что греческие диакритические знаки добавляются или удаляются, как тонны для таких слов, как Ρύθμιση -> ΡΥΘΜΙΣΗ.Это можно сделать, но это намного сложнее и потребует более тяжелого регулярного выражения для оценки всех случаев.

0 голосов
/ 08 декабря 2018

Я не знаком с греческим алфавитом, но я бы предложил реализовать собственный метод строчных букв. Вот пример

char ToLowerCaseGreek(char letter) =>
return (char)(((int)letter) - ((int)'Α') - ((int)'α'));

Сначала мы вычислим смещение между началом греческого алфавита верхнего регистра (верхнийрегистр альфа) в начало строчного греческого алфавита (альфа нижнего регистра), чем мы вычитаем это смещение из нашего символа греческого алфавита верхнего регистра, чтобы получить символ нижнего регистра, который ему соответствует.

...