удалить умлауты или специальные символы в строке javascript

Никогда раньше не играл с умлаутами или специальными символами в строках javascript. Моя проблема в том, как их удалить?

Например, у меня есть это в javascript:

var oldstr = "Bayern München";
var str = oldstr.split(' ').join('-');

Результат Бавария-Мюнхен в порядке, но теперь я хочу удалить умлаут или специальный символ, например:

Реал Спортинг де Хихон.

Как я могу это осознать?

С уважением,

откровенный


person Frank    schedule 26.01.2011    source источник
comment
Чтобы прокомментировать чей-то ответ, вам нужна ссылка добавления комментария — если вы добавите ответ, этот человек не получит никакого уведомления и может не вернуться, чтобы посмотреть. Единственная проблема, которую я вижу в вашем коде, заключается в том, что в первой строке отсутствуют кавычки. jQuery не должен быть проблемой, у меня работает: jsbin.com/axasa4 Теперь литеральные символы могут стать жертвой к проблемам с кодировкой, поэтому вместо этого вы можете использовать escape-последовательности Unicode: jsbin.com/axasa4/2   -  person T.J. Crowder    schedule 26.01.2011
comment
TJ, кодировка не должна быть проблемой, так как оба символа «ü» написаны на одной странице. (Согласовано с комментариями, отсутствующими кавычками и jQuery)   -  person Martijn    schedule 26.01.2011
comment
@Martijn: я открыт для идеи, что данные поступают откуда-то еще, люди обслуживают страницу с неправильной кодировкой и т. д. и т. д.   -  person T.J. Crowder    schedule 26.01.2011
comment
@TJ, ты прав насчет защитного программирования в целом; Я имел в виду этот конкретный случай. Опять же, Фрэнк также не вставил свой фактический код (поскольку он ничего не вернет без этих кавычек). О, и спасибо за ссылку на jsbin, я этого не знал. :-)   -  person Martijn    schedule 26.01.2011
comment
Извините за пропущенные кавычки ^^   -  person Frank    schedule 27.01.2011
comment
Связанный вопрос: stackoverflow.com/questions/11815883/   -  person Max    schedule 14.05.2014
comment
Возможный дубликат Удалить акценты/диакритические знаки в строке в JavaScript   -  person Mureinik    schedule 03.08.2018


Ответы (1)


replace должен сделать это за вас, например:

var str = str.replace(/ü/g, 'u');

...конечно, ü и u не это одна и та же буква. :-)

Если вы пытаетесь заменить все символы за пределами заданного диапазона чем-то (например, -), вы можете сделать это, указав диапазон:

var str = str.replace(/[^A-Za-z0-9\-_]/g, '-');

Это заменяет все символы, кроме английских букв, цифр, - или _, на -. (Диапазон символов — [...] бит, ^ в начале означает «нет».) Вот живой пример.

Но это («Бавария-М-нхен») может показаться г-ну Мюнхену немного неприятным. :-) Вы можете использовать функцию, переданную в replace, чтобы попытаться просто удалить диакритические знаки:

var str = str.replace(/[^A-Za-z0-9\-_]/g, function(ch) {
  // Character that look a bit like 'a'
  if ("áàâä".indexOf(ch) >= 0) { // There are a lot more than this
    return 'a';
  }
  // Character that look a bit like 'u'
  if ("úùûü".indexOf(ch) >= 0) { // There are a lot more than this
    return 'u';
  }
  /* ...long list of others...*/
  // Default
  return '-';
});

Живой пример

Приведенное выше оптимизировано для длинных строк. Если сама строка короткая, вам может быть лучше использовать повторяющиеся регулярные выражения:

var str = str.replace(/[áàâä]/g, 'a')
             .replace(/[úùûü]/g, 'u')
             .replace(/[^A-Za-z0-9\-_]/g, '-');

...но это спекулятивно.

Обратите внимание, что буквальные символы в строках JavaScript вполне допустимы, но вы можете столкнуться с забавой при кодировании файлов. Я склонен придерживаться экранирования юникода. Так, например, приведенное выше будет:

var str = str.replace(/[\u00e4\u00e2\u00e0\u00e1]/g, 'a')
             .replace(/[\u00fc\u00fb\u00f9\u00fa]/g, 'u')
             .replace(' ','-');

...но опять же, есть еще много дел...

person T.J. Crowder    schedule 26.01.2011
comment
Это будет делать это, пока символ всегда ü :) - person Sarfraz; 26.01.2011
comment
@Sarfraz: Ну, это был его пример, но я редактировал более общее решение. :-) - person T.J. Crowder; 26.01.2011
comment
Обратите внимание, что, поскольку Bayern-München является немецким, вы должны следовать немецким правилам и замените 'ü' на 'ue'... :-) - person Martijn; 26.01.2011
comment
@Martijn: Спасибо. (Я почти ничего не знаю о немецком языке.) - person T.J. Crowder; 26.01.2011
comment
@Martijn Опять же, как немец, я бы сказал, пока это только Бавария-Мюнхен, кого это волнует? :-) - person cg.; 11.07.2013
comment
Есть ли полный список этих персонажей? - person Tom; 01.01.2014
comment
Я попробовал ваше последнее предложение в букмарклете, но символы постоянно возвращаются к кодировке URL. Он должен быть var str = str.replace(/[åä]/g, 'a').replace(/[ö]/g, 'o');, но он превращается в var str = str.replace(/[%c3%a5%c3%a4]/g, 'a').replace(/[%c3%b6]/g, 'o');, и тогда он не работает. Как предотвратить это? - person d-b; 06.12.2019