Замена акцентов на их аналоги в AS3

Как я могу продолжить замену éëíïñÑ (и т. Д.) На их аналоги? т.е. eeiinN.

Я думал о сопоставлении регулярных выражений с é -> & eacute; и заменив как &, так и острый / могилу; с пустыми строками, но я не могу найти функцию AS3, которая кодирует акценты для их нечисловых сущностей (& # 234; и т.п.). Я уже пробовал использовать ассоциативный массив a la entity ["À"] = "A" ;, но AS3, похоже, не любит ключи Unicode.

Любые предложения будут ценны.

Спасибо!

Ответов (6)

Решение

Это называется «разложением в кодировке Unicode», поэтому для этого вам может понадобиться поискать в Google. Однако, если вы имеете дело с языками, отличными от вашего собственного, не делайте этого.

Я знаю, что эта идея кажется разумной носителям английского языка, которые не знают других языков, но для людей, для которых эти символы являются буквами, она имеет такой же смысл, как замена «W» на «VV», «d» на «cl» и «Q». "с" O "для говорящего по-английски.

PS Поскольку вы спросили:

Вы можете перебрать строку charCodeAt() и сделать свой ассоциативный массив целыми числами. Но все равно не рекомендую.

«Донья» означает «леди», но «донья» означает «пончик». «Де» означает «от», а «де» означает «отдавать». И так далее.

Это не просто обычные буквы с надоедливыми пятнами, они на самом деле такие же разные, как «E» и «F» или «P» и «R».

Надеюсь, это будет полезно для всех: https://github.com/infralabs/DiacriticsRemove

Этот класс удаляет диакритические знаки из строк, содержащих специальные символы Latin-1 Supplement, Latin Extended-A и Latin Extended-B.

использование:

var specialCharacters:String = "";
specialCharacters+="Latin-1 Supplement\n";
specialCharacters+="ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\n";
specialCharacters+="Latin Extended-A\n";
specialCharacters+="ĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſ\n";
specialCharacters+="Latin Extended-B\n";
specialCharacters+="ƒǺǻǼǽǾǿ\n";
specialCharacters+="Latin Extended Additional\n";
specialCharacters+="ẀẁẂẃẄẅỲỳ\n";

trace(new DiacriticsRemove().Parse(specialCharacters));

источник:

Дополнение Latin-1

ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ × ØÙÚÛÜÝÞßàáâãäåæçèéëêëìíîïðñòóôõö ÷ øùúûüýþÿ

Расширенная латиница-A

ĀĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſ

Расширенная латиница-B

ƒǺǻǼǽǾǿ

Расширенная латиница Дополнительная

ẀẁẂẃẄẅỲỳ

результат:

Дополнение Latin-1

AAAAAAAECEEEEIIIIDNOOOOO × OUUUUYTHssaaaaaaaeceeeeiiiidnooooo ÷ ouuuuythy

Расширенная латиница-A

AaAaAaCcCcCcCcDdDdEeEeEeEeEeGgGgGgGgHhHhIiIiIiIiIiIJijJjKkĸLlLlLlLlLlLlNnNnNnnNnOoOoOoOEoeRrRRrzsTuZuZuZuZuZuZuZuZuZuZuZuZuZuZuZuZuZuZuZuZuZuZuZuZuZuZuZu

Расширенная латиница-B

fAaAEaeOo

Расширенная латиница Дополнительная

WwWwWwYy

Другая альтернатива:

    public static function noAccent(source:String):String
    {
        source = source.replace(/[àáâãäå]/g, "a");
        source = source.replace(/[ÀÁÂÃÄÅ]/g, "A");
        source = source.replace(/[èéêë]/g, "e");
        source = source.replace(/[ËÉÊÈ]/g, "E");
        source = source.replace(/[ìíîï]/g, "i");
        source = source.replace(/[ÌÍÎÏ]/g, "I");
        source = source.replace(/[ðòóôõöø]/g, "o");
        source = source.replace(/[ÐÒÓÔÕÖØ]/g, "O");
        source = source.replace(/[ùúûü]/g, "u");
        source = source.replace(/[ÙÚÛÜ]/g, "U");
        source = source.replace(/[ýýÿ]/g, "y");
        source = source.replace(/[ÝÝŸ]/g, "Y");
        source = source.replace(/[ç]/g, "c");
        source = source.replace(/[Ç]/g, "C");
        source = source.replace(/[ñ]/g, "n");
        source = source.replace(/[Ñ]/g, "N");
        source = source.replace(/[š]/g, "s");
        source = source.replace(/[Š]/g, "S");
        source = source.replace(/[ž]/g, "z");
        source = source.replace(/[Ž]/g, "Z");
        source = source.replace(/[æ]/g, "ae");
        source = source.replace(/[Æ]/g, "AE");
        source = source.replace(/[œ]/g, "oe");
        source = source.replace(/[Œ]/g, "OE");
        return source;
    }

Источник: http://blog.geturl.net/post/2010/01/31/[AS3 provided-Supprimer-tous-les-accents-d-une-chaine-de-caract%C3%A8re

Исправлено это для немецкого языка, так как вы используете «Ae» для «Ä», «Oe» для «Ö» и т. Д.

    /**
     * Helper arrays for unicode decomposition
     */
     var pattern:Array = new Array();
        pattern.push(new RegExp("Š", "g") );
        pattern.push( new RegExp("[΅]", "g"));
        pattern.push( new RegExp("Ž", "g"));
        pattern.push( new RegExp("š", "g"));
        pattern.push(new RegExp("[Ϛ]", "g"));
        pattern.push( new RegExp("ž", "g"));
        pattern.push(new RegExp("[ÀÁÂÃÅ]","g"));
        pattern.push( new RegExp("[ÆÄ]","g"));
        pattern.push( new RegExp("Ç","g"));
        pattern.push( new RegExp("[ÈÉÊË]","g"));
        pattern.push(new RegExp("[ÌÍÎÏ]", "g"));
        pattern.push( new RegExp("Ð", "g"));
        pattern.push( new RegExp("Ñ","g"));
        pattern.push( new RegExp("[ÒÓÔÕØ]", "g"));
        pattern.push( new RegExp("Ü","g"));
        pattern.push( new RegExp("[ÙÚÛ]","g"));
        pattern.push( new RegExp("[ŸÝ]", "g"));
        pattern.push( new RegExp("Þ", "g"));
        pattern.push( new RegExp("ß", "g"));
        pattern.push( new RegExp("[àáâãå]","g"));       
        pattern.push( new RegExp("[æä]","g"));
        pattern.push( new RegExp("ç","g"));
        pattern.push( new RegExp("[èéêë]","g"));
        pattern.push( new RegExp("[ìíîï]","g"));
        pattern.push( new RegExp("ð", "g"));
        pattern.push( new RegExp("ñ","g"));
        pattern.push( new RegExp("[òóôõø]", "g"));
        pattern.push( new RegExp("ü","g"));
        pattern.push( new RegExp("[ùúû]","g"));
        pattern.push( new RegExp("[ýÿ]","g"));
        pattern.push( new RegExp("þ", "g"));

         var patternReplace:Array = [
            "S",
            "Oe",
            "Z",
            "s",
            "oe",
            "z",
            "A",
            "Ae",
            "C",
            "E",
            "I",
            "D",
            "N",
            "O",
            "Ue",
            "U",
            "Y",
            "Th",
            "ss",
            "a",
            "ae",
            "c",
            "e",
            "i",
            "d",
            "n",
            "o",
            "ue",
            "u",
            "y",
            "th"];

    /**
     * Returns the Unicode decomposition of a given run of accented text. 
     * @param value The original string
     * @return The string without accents
     */     
    private static function decomposeUnicode(str:String):String
    {
        for (var i:int = 0; i < pattern.length; i++)
        {
            str = str.replace(pattern[i], patternReplace[i]);
        }
        return str;
    }
    private var sdiakA:Array;
    private var bdiakA:Array;
    private function initReplaceDiacritic(){
        var sdiak = "áäčďéěíĺľňóôöŕšťúůüýřžÁÄČĎÉĚÍĹĽŇÓÔÖŔŠŤÚŮÜÝŘŽ";
        var bdiak = "aacdeeillnooorstuuuyrzAACDEEILLNOOORSTUUUYRZ";
        sdiakA = new Array();
        bdiakA = new Array();

        for (var i=0;i<sdiak.length;i++)
            sdiakA.push(new RegExp(sdiak.charAt(i), "g"))
        for (i=0;i<sdiak.length;i++)
            bdiakA.push(bdiak.charAt(i))
    }
    private function replaceDiacritic(string:String){               
        for (var i:int = 0; i < sdiakA.length; i++)
            string = string.replace(sdiakA[i], bdiakA[i]);
        return (string)
    }
initReplaceDiacritic();
var str = replaceDiacritic("šžřáíéééíčšřčš");

Спасибо за ответ.

Я из Аргентины, мы говорим по-испански, и, как сказал Маркус, удаление акцента может изменить все значение слова. Но я также хотел бы сказать, что есть сценарии, когда лучше убрать акценты.

Я пишу скрипт для функции поиска, где можно найти людей по названию. Данные поступают из регистрационной формы, в которой люди пишут свои имена так, как им нравится, например: Лопес / Лопес, Матиас / Матиас и т. Д.

Таким образом, для AS3 «Lopez» и «López» - это разные слова, и я хотел бы, чтобы они оба появлялись в результатах поиска, когда пользователь вводит «lopez».

Таким образом, мое решение - удалить все акценты и использовать маску в текстовом поле поля поиска, чтобы избежать использования акцентов. Я думаю, это лучшее решение, у кого-нибудь есть идея получше? Благодарю вас!