首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在字符串比较中忽略重音字母

在字符串比较中忽略重音字母
EN

Stack Overflow用户
提问于 2008-12-11 15:57:05
回答 5查看 76.1K关注 0票数 153

我需要比较C#中的2个字符串,并将重音字母视为非重音字母。例如:

代码语言:javascript
复制
string s1 = "hello";
string s2 = "héllo";

s1.Equals(s2, StringComparison.InvariantCultureIgnoreCase);
s1.Equals(s2, StringComparison.OrdinalIgnoreCase);

这两个字符串需要相同(就我的应用程序而言),但这两个语句的计算结果都为false。在C#中有没有办法做到这一点?

EN

回答 5

Stack Overflow用户

发布于 2011-10-11 10:48:31

如果不需要转换字符串,并且只想检查是否相等,可以使用

代码语言:javascript
复制
string s1 = "hello";
string s2 = "héllo";

if (String.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace) == 0)
{
    // both strings are equal
}

或者,如果您还希望比较不区分大小写

代码语言:javascript
复制
string s1 = "HEllO";
string s2 = "héLLo";

if (String.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase) == 0)
{
    // both strings are equal
}
票数 146
EN

Stack Overflow用户

发布于 2013-12-20 00:15:38

我不得不做一些类似的事情,但使用的是StartsWith方法。这是一个从@Serge - appTranslator派生的简单解决方案。

下面是一个扩展方法:

代码语言:javascript
复制
    public static bool StartsWith(this string str, string value, CultureInfo culture, CompareOptions options)
    {
        if (str.Length >= value.Length)
            return string.Compare(str.Substring(0, value.Length), value, culture, options) == 0;
        else
            return false;            
    }

对于一个班轮来说,是个怪胎;)

代码语言:javascript
复制
    public static bool StartsWith(this string str, string value, CultureInfo culture, CompareOptions options)
    {
        return str.Length >= value.Length && string.Compare(str.Substring(0, value.Length), value, culture, options) == 0;
    }

called和case incensitive可以这样命名

代码语言:javascript
复制
value.ToString().StartsWith(str, CultureInfo.InvariantCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase)
票数 6
EN

Stack Overflow用户

发布于 2008-12-11 16:57:06

下面的方法CompareIgnoreAccents(...)处理您的示例数据。以下是我获得背景信息的文章:http://www.codeproject.com/KB/cs/EncodingAccents.aspx

代码语言:javascript
复制
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)));
}

我认为扩展方法会更好:

代码语言:javascript
复制
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)));
}

那么它的用法是:

代码语言:javascript
复制
if(string.Compare(s1.RemoveAccents(), s2.RemoveAccents(), true) == 0) {
   ...
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/359827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档