Замена умляутов в 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