代码之家  ›  专栏  ›  技术社区  ›  ilija veselica

字符串替换c[重复]中的音调符号

  •  4
  • ilija veselica  · 技术社区  · 15 年前

    这个问题已经有了答案:

    我想使用 this 方法创建用户友好的URL。因为我的网站是克罗地亚语的,有一些字符我不想剥掉,而是用另一个字符替换它们。例如,此字符串:
    ___ _½_ _
    需要: SDCZZ SDCZZ

    因此,我想制作两个数组,一个包含要替换的字符,另一个包含替换字符的数组:

    string[] character = { "Š", "Đ", "Č", "Ć", "Ž", "š", "đ", "č", "ć", "ž" };
    string[] characterReplace = { "s", "d", "c", "c", "z", "s", "d", "c", "c", "z" };
    

    最后,这两个数组应该在某些方法中使用,这些方法将获取字符串、查找匹配项并替换它们。在PHP中,我使用preg_replace函数来处理这个问题。在C中,这不起作用:

    s = Regex.Replace(s, character, characterReplace);
    


    如果有人能帮忙,我会很感激的。 谢谢

    3 回复  |  直到 11 年前
        1
  •  12
  •   Community CDub    8 年前

    似乎你想去掉音调符号,留下基本字符。我建议 Ben Lings's solution 在这里:

    string input = "ŠĐĆŽ šđčćž";
    string decomposed = input.Normalize(NormalizationForm.FormD);
    char[] filtered = decomposed
        .Where(c => char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
        .ToArray();
    string newString = new String(filtered);
    

    编辑:小问题!它不适用于_。结果是:

    SĐCZ sđccz
    
        2
  •  13
  •   Josh Stodola    15 年前

    斯基特 mentioned the following code on a newsgroup

    static string RemoveAccents (string input)
    {
        string normalized = input.Normalize(NormalizationForm.FormKD);
        Encoding removal = Encoding.GetEncoding(Encoding.ASCII.CodePage,
                                                new EncoderReplacementFallback(""),
                                                new DecoderReplacementFallback(""));
        byte[] bytes = removal.GetBytes(normalized);
        return Encoding.ASCII.GetString(bytes);
    }
    

    编辑

    也许我疯了,但我只是跑了以下几步…

    Dim Input As String = "ŠĐĆŽ-šđčćž"
    Dim Builder As New StringBuilder()
    
    For Each Chr As Char In Input
        Builder.Append(Chr)
    Next
    
    Console.Write(Builder.ToString())
    

    结果是 SDCZ-sdccz

        3
  •  0
  •   DonaldRay    15 年前

    字典是解决这一问题的合理方法…

    Dictionary<char, char> AccentEquivelants = new Dictionary<char, char>();
    AccentEquivelants.Add('Å ', 's');
    //...add other equivelents
    
    string inputstring = "";
    StringBuilder FixedString = new StringBuilder(inputstring);
    for (int i = 0; i < FixedString.Length; i++)
        if (AccentEquivelants.ContainsKey(FixedString[i]))
            FixedString[i] = AccentEquivelants[FixedString[i]];
    return FixedString.ToString();
    

    在执行这样的字符串操作时,需要使用StringBuilder,因为C中的字符串是不可变的,因此一次更改一个字符将在内存中创建多个字符串对象,而StringBuilder是可变的,没有这个缺点。