Как заменить акценты (немецкий) в .NET

Мне нужно заменить акценты в строке на их английские эквиваленты

Например

ä = ae

ö = oe

Ö = Oe

ü = ue

Я знаю, что их можно снять со шнура, но я не знал о замене.

Пожалуйста, дайте мне знать, если у вас есть предложения. Я кодирую на С#


person subha    schedule 13.08.2009    source источник
comment
Взгляните на ответы, в которых упоминается RemoveDiacritics, здесь: акценты с английскими эквивалентами"> stackoverflow.com/questions/7470997/   -  person user1073075    schedule 12.03.2018


Ответы (5)


Если вам нужно использовать это для больших строк, несколько вызовов Replace() могут довольно быстро стать неэффективными. Возможно, вам лучше перестроить свою строку посимвольно:

var map = new Dictionary<char, string>() {
  { 'ä', "ae" },
  { 'ö', "oe" },
  { 'ü', "ue" },
  { 'Ä', "Ae" },
  { 'Ö', "Oe" },
  { 'Ü', "Ue" },
  { 'ß', "ss" }
};

var res = germanText.Aggregate(
              new StringBuilder(),
              (sb, c) => map.TryGetValue(c, out var r) ? sb.Append(r) : sb.Append(c)
              ).ToString();
person dahlbyk    schedule 13.08.2009
comment
Хорошее решение. Я расширил его для обработки всего ISO-8859-1: codepad.org/dUMpGlgg - person primo; 01.02.2017
comment
короче: res = text.Aggregate(new StringBuilder(), (sb, c) => map.TryGetValue(c, out string r) ? sb.Append(r) : sb.Append(c)).ToString(); ;) - person AntiHeadshot; 08.11.2018
comment
Обновлено! Нравится эволюция C# с помощью этих приятных маленьких ярлыков. - person dahlbyk; 08.11.2018

Вы просто хотите сопоставить немецкие умлауты с двухбуквенным (не умлаутским) вариантом? Ну вот; непроверенный, но он обрабатывает все немецкие умлауты.

String replaceGermanUmlauts( String s ) {
    String t = s;
    t = t.Replace( "ä", "ae" );
    t = t.Replace( "ö", "oe" );
    t = t.Replace( "ü", "ue" );
    t = t.Replace( "Ä", "Ae" );
    t = t.Replace( "Ö", "Oe" );
    t = t.Replace( "Ü", "Ue" );
    t = t.Replace( "ß", "ss" );
    return t;
}
person Frerich Raabe    schedule 13.08.2009

Я не могу придумать никакого автоматического способа сделать это, поэтому я считаю, что вам придется делать это вручную.

ie.

string GermanString = "äö";
GermanString = GermanString.Replace("ä", "ae");
GermanString = GermanString.Replace("ö", "oe");

Сколько персонажей? Все гласные в верхнем и нижнем регистре, значит, 10? Не должно быть слишком много работы.

person Paul McLean    schedule 13.08.2009

Как насчет использования string.Replace:

string germanText = "Mötörhead";
string replaced = germanText.Replace("ö", "oe");

(ладно, не совсем немецкое слово, но я не удержался)

Вы можете связать вызовы для замены, как это

someText.Replace("ö", "oe").Replace("ä", "ae").Replace("ö", "oe")...
person Mark Seemann    schedule 13.08.2009
comment
На самом деле это Motörhead ;) - person Otto Abnormalverbraucher; 28.10.2014

Этот класс удаляет диакритические знаки (é, ì, è и т. д.) и заменяет умлауты и немецкое «ß» их эквивалентами «ae (ä)», «oe (ö)», «ue (ü)» и «ss». (SS)".

public sealed class UmlautConverter
{
    private Dictionary<char, string> converter = new Dictionary<char, string>()
    {
        {  'ä', "ae" },
        {  'Ä', "AE" },
        {  'ö', "oe" },
        {  'Ö', "OE" },
        {  'ü', "ue" },
        {  'Ü', "UE" },
        {  'ß', "ss" }
    };

    string value = null;
    public UmlautConverter(string value)
    {
        if (!string.IsNullOrWhiteSpace(value))
        {
            this.value = value;
        }
    }
    public string RemoveDiacritics()
    {
        if (string.IsNullOrWhiteSpace(value))
        {
            return null;
        }

        string normalizedString = this.value.Normalize();

        foreach (KeyValuePair<char, string> item in this.converter)
        {
            string temp = normalizedString;
            normalizedString = temp.Replace(item.Key.ToString(), item.Value);
        }

        StringBuilder stringBuilder = new StringBuilder();

        for (int i = 0; i < normalizedString.Length; i++)
        {
            normalizedString = normalizedString.Normalize(NormalizationForm.FormD);
            string c = normalizedString[i].ToString();
            if (CharUnicodeInfo.GetUnicodeCategory(Convert.ToChar(c)) != UnicodeCategory.NonSpacingMark)
            {
                stringBuilder.Append(c);
            }
        }
        return stringBuilder.ToString();
    }

    public bool HasUmlaut()
    {
        if (string.IsNullOrWhiteSpace(value))
        {
            return false;
        }

        foreach (KeyValuePair<char, string> item in this.converter)
        {
            if (this.value.Contains(item.Key.ToString()))
            {
                return true;
            }
        }

        return false;
    }
}

Применение:

Console.WriteLine(new UmlautConverter("Nürnberger Straße").RemoveDiacritics()); // Nuernberger Strasse

        Console.WriteLine(new UmlautConverter("Größenwahn").RemoveDiacritics()); // Groessenwahn
        Console.WriteLine(new UmlautConverter("Übermut").RemoveDiacritics()); // UEbermut
        Console.WriteLine(new UmlautConverter("Università").RemoveDiacritics()); // Universita
        Console.WriteLine(new UmlautConverter("Perché").RemoveDiacritics());// Perche
        Console.WriteLine(new UmlautConverter("être").RemoveDiacritics()); // etre

В случае "Übermut" есть небольшая ошибка, заменяющая "Ü" на "UE" вместо Ue". Но это можно легко исправить. Наслаждайтесь :)

person Andreas Ahlen    schedule 18.10.2019