替换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;
}

作为我尝试的搜索模式:

  • "ä"ö"ü"
  • /ä/,/ö//
  • "ä"、"ö"one_answers"ü"(完全绝望;-)

可以肯定的是,这不是我尝试indexOf:的替换函数的问题

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

但所有模式的输出为:-1

所以我想这是编码方面的某种问题,但正如我在页面上所说,元音变音符看起来确实很好。

有什么想法吗?这看起来很简单。。。

编辑:即使我找到了答案,这个问题也没有真正从根本上解决(编码)。这是我的页面编码:

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

数据库具有:utf8_general_ci

对我来说似乎完全可以。

请确保正确指定了脚本的编码(在<script>标记中,如果嵌入了,则在页面的页眉/元中),或者使用uNNNN语法指定符号,这些符号将始终明确地解析为某个特定的Unicode代码点。

例如:

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

无论为页面/脚本设置了什么编码,即使编码不正确,也会始终用ae替换ä。

以下是日耳曼语言所需的代码:

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

如果您希望通过巧妙地尊重案例来替换德语元音变音符,请使用以下内容(开源,很乐意分享,全部由我提供):

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)))

它将:

  • Übung->Uebung
  • ÜBUNG->UEBUNG
  • üben->üben
  • einueben->einueben
  • EIN-uben->EINUEBEN
  • Ö也是如此
  • 和简单的ß->ss

这里有一个函数,它可以替换最常见的字符来生成谷歌友好的SEO 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;
}

如果您需要一个小片段来将德语元音变为html特殊字符,请使用

function fixUmlauts(value) {
    value = value.replace(/ä/g, '&auml;');
    value = value.replace(/ö/g, '&ouml;');
    value = value.replace(/ü/g, '&uuml;');
    value = value.replace(/ß/g, '&szlig;');
    value = value.replace(/Ä/g, '&Auml;');
    value = value.replace(/Ö/g, '&Ouml;');
    value = value.replace(/Ü/g, '&Uuml;');
    return value;
}

您需要首先弄清楚要替换的字符代码是什么。例如,根据字符编码,字符可以是8859、UTF-8或其他格式。它们也可以是字符符号,如"ä"

与其猜测,不如把它们打印出来。

请注意,传入的数据可能不会一致地使用相同的字符集/字符编码——您需要检查数据的来源。

因此,使用字符串查看传入的数据。charCodeAt

检查toLowerCase之前的字符代码,以确保它不会改变您的情况。您需要一步一步地调试。

最后,检查编辑器中的字符集设置,以确保您键入的ä是应该的。您可能希望通过UTF8值指定它,而不是键入ä,öetc

最新更新