Замена умляутов в JS

Я сравниваю строки и должен заменить умляуты в JS, но, похоже, JS не распознает умлауты в строках. Текст поступает из базы данных, а в браузере умляуты прекрасно показывают.

function replaceUmlauts(string)
{
    value = string.toLowerCase();
    value = value.replace(/ä/g, 'ae');
    value = value.replace(/ö/g, 'oe');
    value = value.replace(/ü/g, 'ue');
    return value;
}

В качестве шаблонов поиска я попытался:

  • "ä", "ö", "ü"
  • /ä/,/ö/,/ü/
  • "ä", "ö", "ü" (полное отчаяние; -))

Чтобы быть уверенным, что это не вопрос с функцией замены, я попробовал indexOf:

console.log(value.indexOf('ä'));

Но вывод со всеми шаблонами: -1

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

Любые идеи? Это кажется таким простым...

EDIT: Даже если я нашел свой ответ, проблема не была решена "в корне" (кодировка). Это моя кодировка страницы:

<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">

В базе данных есть: utf8_general_ci

Казалось бы, все в порядке.

Ответ 1

Либо убедитесь, что ваша кодировка script правильно указана (в теге <script> или в заголовке/метатеге страницы, если она встроена), либо укажите символы с синтаксисом \uNNNN, которые всегда будут однозначно разрешать какой-то определенный код Unicode.

Например:

str.replace(/\u00e4/g, "ae")

Всегда будет заменять a на ae, независимо от того, какая кодировка установлена ​​для вашей страницы / script, даже если она неверна.

Вот коды, необходимые для немецких языков:

// Ü, ü     \u00dc, \u00fc
// Ä, ä     \u00c4, \u00e4
// Ö, ö     \u00d6, \u00f6
// ß        \u00df

Ответ 2

Здесь функция, которая заменяет наиболее распространенные символы для создания дружественного Google URL-адреса:

function deUmlaut(value){
  value = value.toLowerCase();
  value = value.replace(/ä/g, 'ae');
  value = value.replace(/ö/g, 'oe');
  value = value.replace(/ü/g, 'ue');
  value = value.replace(/ß/g, 'ss');
  value = value.replace(/ /g, '-');
  value = value.replace(/\./g, '');
  value = value.replace(/,/g, '');
  value = value.replace(/\(/g, '');
  value = value.replace(/\)/g, '');
  return value;
}

Ответ 3

Если вы хотите заменить немецкий Umlaute на умное уважение к делу, воспользуйтесь этим (открытое, я рад поделиться всем):

const umlautMap = {
  '\u00dc': 'UE',
  '\u00c4': 'AE',
  '\u00d6': 'OE',
  '\u00fc': 'ue',
  '\u00e4': 'ae',
  '\u00f6': 'oe',
  '\u00df': 'ss',
}

function replaceUmlaute(str) {
  return str
    .replace(/[\u00dc|\u00c4|\u00d6][a-z]/g, (a) => {
      const big = umlautMap[a.slice(0, 1)];
      return big.charAt(0) + big.charAt(1).toLowerCase() + a.slice(1);
    })
    .replace(new RegExp('['+Object.keys(umlautMap).join('|')+']',"g"),
      (a) => umlautMap[a]
    );
}

const test = ['Übung', 'ÜBUNG', 'üben', 'einüben', 'EINÜBEN', 'Öde ätzende scheiß Übung']
test.forEach((str) => console.log(str + " -> " + replaceUmlaute(str)))

Ответ 4

Вам нужно сначала выяснить, какие коды символов вы пытаетесь заменить. Например, в зависимости от кодировки символов символы могут быть в 8859, UTF-8 или что-то еще. Они также могут быть символьными символами, такими как "& auml;"

Вместо того, чтобы угадывать, распечатайте их.

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

Итак, посмотрите на входящие данные, используя строку. charCodeAt

Проверьте код символа перед toLowerCase, чтобы убедиться, что он не изменит вас. Вам нужно будет отлаживать шаг за шагом.

Наконец, проверьте настройки набора символов в своем редакторе, чтобы убедиться, что ваш типизированный ä является тем, чем он должен быть. Вы можете указать его с помощью значения UTF8 вместо ввода ä, ö etc