12

我需要将字符串中的重音替换为他们的英语等价物

例如

ä = ae

ö = oe

Ö = Oe

ü = ü

我知道从字符串中剥离它们,但我不知道替换。

如果您有任何建议,请告诉我。我正在用 C# 编码

4

5 回答 5

38

如果您需要在较大的字符串上使用它,多次调用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();
于 2009-08-13T12:37:21.523 回答
11

是否只想将德语变音符号映射到两个字母(非变音符号)变体?干得好; 未经测试,但它处理所有德国变音符号。

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;
}
于 2009-08-13T12:16:55.960 回答
4

我想不出任何自动的方法来做到这一点,所以我相信你必须手动完成。

IE。

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

有多少个字符?所有元音,大写和小写,所以,10?工作不应该太多。

于 2009-08-13T12:11:36.100 回答
0

如何使用 string.Replace:

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

(好吧,不是真正的德语单词,但我无法抗拒)

您可以像这样将调用链接到 Replace

someText.Replace("ö", "oe").Replace("ä", "ae").Replace("ö", "oe")...
于 2009-08-13T12:15:47.777 回答
0

此类删除变音符号(é、ì、è 等)并将变音符号和德语“ß”替换为对应的“ae (ä)”、“oe (ö)”、“ue (ü)”和“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”。但这很容易修复。享受:)

于 2019-10-18T06:33:07.187 回答