Замена акцентов на их аналоги в AS3
-
06-09-2019 - |
Вопрос
Как бы я продолжил менять éníñÑ (и т. д.) на их аналоги?то есть, ээинН.
Я думал о сопоставлении регулярных выражений с é -> éи заменяя как &, так и острый/серьезный;с пустыми строками, но я не могу найти функцию AS3, которая кодирует акценты на их нечисловые объекты (êи тому подобное).Я уже пробовал использовать ассоциативный массив, а-ля юридические лица["À"] = "A";, но AS3, похоже, не любит ключи Юникода.
Любые предложения будут ценны.
Спасибо!
Решение
Это называется «разложение Unicode», поэтому вы можете захотеть Google для этого. Однако, если вы имеете дело с языками, отличными от ваших собственных, не делайте этого.
Я знаю, что идея кажется разумной для носителей английского языка, которые не знают других языков, но людям, для которых эти персонажи - это буквы, это так же, как замена «w» на «VV», «D» с «CL» и «Q "С" о ", будет ли вы оратор английский.
PS, так как вы спросили:
Вы можете пройти через строку, делая charCodeAt()
и сделайте свой ассоциативный массив на целых числах. Но я все еще не рекомендую это.
«Донья» означает «леди», но «Дона» означает «пончик». «De» означает »от» и «dé» означает «дать». И так далее.
Они не просто нормальные буквы с раздражающими видами мух, на самом деле они так же различны, как «E» и «F» или «P» и «r».
Другие советы
Спасибо за ответ.
Я из Аргентины, мы говорим по -испански, и, как сказал Маркуск, удаление акцента может изменить все значение слова. Но я также хотел бы сказать, что есть некоторые сценарии, где удаление акцентов лучше.
Я пишу сценарий для функции поиска, где вы можете найти людей по его названию. Данные поступают из регистрационной формы, где люди пишут свои имена так, как им нравится, то есть: Lopez/Lópes, Matias/Matías и т. Д.
Таким образом, для AS3 "Lopez" и "López" - это отличные слова, и я хотел бы, чтобы они оба были в результатах поиска, когда пользователь ищет «Lopez».
Таким образом, мое решение состоит в том, чтобы удалить все акценты и использовать маску в текстовом поле поиска, чтобы избежать использования акцентов. Я думаю, что лучшее решение, у кого -нибудь есть лучшая идея? Спасибо!
Исправлено для немецкого языка, поскольку вы используете «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("šžřáíéééíčšřčš");
Я надеюсь, что это будет полезно для всех:https://github.com/infralabs/diacriticsremove
Этот класс удаляет диакритику из строк, содержащих добавки латинского 1, латинские специальные символы 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));
источник:
Латинская добавка
ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
Латинский расширенный-А
ĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſ
Латинский расширенный-B
ƒǺǻǼǽǾǿ
Латынь расширил дополнительный
ẀẁẂẃẄẅỲỳ
результат:
Латинская добавка
Aaaaaaaeceeeeeiiiidnooooo x uuuuuyythssaaaaaaeeeeeeiiiidnooooo ÷ uuuuuythythy
Латинский расширенный-А
AaAaAaCcCcCcCcDdDdEeEeEeEeEeGgGgGgGgHhHhIiIiIiIiIiIJijJjKkĸLlLlLlLlLlNnNnNnnNnOoOoOoOEoeRrRrRrSsSsSsSsTtTtTtUuUuUuUuUuUuWwYyYZzZzZzs
Латинский расширенный-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;
}