Игнорирование букв с диакритическим знаком в сравнении строк

Когда на рабочем столе отображается значок запуска, на экране появляется следующее событие:

  • Приложение Homescreen / Launcher отправляет намерение начать действие с использованием функции startActivity () ( startActivity () является вызовом связующего звена для ActivityManager)
  • Activity Manager отправляет запрос процесса fork с использованием сокета на Zygote.
  • Zygote открывает новый экземпляр виртуальной машины, который загружает ActivityThread (поток активности управляет
  • ActivityThread имеет реальный main () для приложения.
  • .
  • ActivityThread имеет реальный main () для приложения.
  • ]
  • ActivityThread вызывает приложение onCreate ().

Поэтому ActivityThread отвечает за создание экземпляра Activity (внутри метода performLaunchActivity)

Объяснение:

Если вы наблюдаете stacktrace:

android.app.Instrumentation.newActivity(Instrumentation.java:1021)
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)

Код, в котором создается новая активность:

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    ... //More code
    Activity activity = null;
    try {
        java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
        activity = mInstrumentation.newActivity(
                cl, component.getClassName(), r.intent);
        StrictMode.incrementExpectedActivityCount(activity.getClass());
        r.intent.setExtrasClassLoader(cl);
        r.intent.prepareToEnterProcess();
        if (r.state != null) {
            r.state.setClassLoader(cl);
        }
    } catch (Exception e) {
        if (!mInstrumentation.onException(activity, e)) {
            throw new RuntimeException(
                "Unable to instantiate activity " + component
                + ": " + e.toString(), e);
        }
    }
    ... //More code
    return activity;
}

Ins trumentation.java (класс будет создан для вас перед любым кодом приложения)

public Activity newActivity(ClassLoader cl, String className,
        Intent intent)
        throws InstantiationException, IllegalAccessException,
        ClassNotFoundException {
    return (Activity)cl.loadClass(className).newInstance();
}
128
задан Jon Tackabury 11 December 2008 в 15:57
поделиться

3 ответа

РЕДАКТИРОВАНИЕ 20.01.2012:Вот это да! решение было настолько более простым и было в платформе почти навсегда. , Как указано knightpfhor:

string.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace);
<час>

Вот функция, которая разделяет диакритические знаки от строки:

static string RemoveDiacritics(string text)
{
  string formD = text.Normalize(NormalizationForm.FormD);
  StringBuilder sb = new StringBuilder();

  foreach (char ch in formD)
  {
    UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(ch);
    if (uc != UnicodeCategory.NonSpacingMark)
    {
      sb.Append(ch);
    }
  }

  return sb.ToString().Normalize(NormalizationForm.FormC);
}
[еще 119] детали на блоге MichKap ( RIP... ).

принцип, это, это поворачивает 'Г©' в 2 последовательных символа 'e', острый. Это затем выполняет итерации через символы и пропускает диакритические знаки.

"hГ©llo" становится "he< acute> Лло", который в свою очередь становится "привет".

Debug.Assert("hello"==RemoveDiacritics("héllo"));
<час>

Примечание: вот более компактный.NET4 + дружественная версия той же функции:

static string RemoveDiacritics(string text)
{
  return string.Concat( 
      text.Normalize(NormalizationForm.FormD)
      .Where(ch => CharUnicodeInfo.GetUnicodeCategory(ch)!=
                                    UnicodeCategory.NonSpacingMark)
    ).Normalize(NormalizationForm.FormC);
}
237
ответ дан 24 November 2019 в 00:34
поделиться

попробуйте эту перегрузку на Строке. Сравните Метод.

Строка. Сравните Метод (Строка, Строка, булевская переменная, CultureInfo)

, Это производит международное значение на основе сравнить операций включая cultureinfo., пример на странице сравнивает "Изменение" в en-США и en-CZ. CH в en-CZ является единственной "буквой".

пример из ссылки

using System;
using System.Globalization;

class Sample {
    public static void Main() {
    String str1 = "change";
    String str2 = "dollar";
    String relation = null;

    relation = symbol( String.Compare(str1, str2, false, new CultureInfo("en-US")) );
    Console.WriteLine("For en-US: {0} {1} {2}", str1, relation, str2);

    relation = symbol( String.Compare(str1, str2, false, new CultureInfo("cs-CZ")) );
    Console.WriteLine("For cs-CZ: {0} {1} {2}", str1, relation, str2);
    }

    private static String symbol(int r) {
    String s = "=";
    if      (r < 0) s = "<";
    else if (r > 0) s = ">";
    return s;
    }
}
/*
This example produces the following results.
For en-US: change < dollar
For cs-CZ: change > dollar
*/

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

http://msdn.microsoft.com/en-us/library/hyxc48dt.aspx

-3
ответ дан 24 November 2019 в 00:34
поделиться

Следующий метод CompareIgnoreAccents(...) работы над Вашими данными в качестве примера. Вот статья, где я получил свою справочную информацию: 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)));
}

я думаю, что дополнительный метод был бы лучше:

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)));
}

Затем использование было бы этим:

if(string.Compare(s1.RemoveAccents(), s2.RemoveAccents(), true) == 0) {
   ...
5
ответ дан 24 November 2019 в 00:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: