Ignoring accented letters in string comparison

后端 未结 6 1214
一向
一向 2020-11-22 10:37

I need to compare 2 strings in C# and treat accented letters the same as non-accented letters. For example:

string s1 = \"hello\";
string s2 = \"héllo\";

s1         


        
6条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-11-22 11:11

    The following method CompareIgnoreAccents(...) works on your example data. Here is the article where I got my background information: http://www.codeproject.com/KB/cs/EncodingAccents.aspx

    private static bool CompareIgnoreAccents(string s1, string s2)
    {
        return string.Compare(
            RemoveAccents(s1), RemoveAccents(s2), StringComparison.InvariantCultureIgnoreCase) == 0;
    }
    
    private static string RemoveAccents(string s)
    {
        Encoding destEncoding = Encoding.GetEncoding("iso-8859-8");
    
        return destEncoding.GetString(
            Encoding.Convert(Encoding.UTF8, destEncoding, Encoding.UTF8.GetBytes(s)));
    }
    

    I think an extension method would be better:

    public static string RemoveAccents(this string s)
    {
        Encoding destEncoding = Encoding.GetEncoding("iso-8859-8");
    
        return destEncoding.GetString(
            Encoding.Convert(Encoding.UTF8, destEncoding, Encoding.UTF8.GetBytes(s)));
    }
    

    Then the use would be this:

    if(string.Compare(s1.RemoveAccents(), s2.RemoveAccents(), true) == 0) {
       ...
    

提交回复
热议问题