在JS中替换变音符号

Sam*_*ami 16 javascript encoding replace

我正在比较字符串并且必须替换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;
}
Run Code Online (Sandbox Code Playgroud)

作为我试过的搜索模式:

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

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

console.log(value.indexOf('ä'));
Run Code Online (Sandbox Code Playgroud)

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

所以我猜这是编码的某种问题,但正如我在页面上所说的,变音符号看起来很好.

有任何想法吗?这看起来很简单......

编辑:即使我找到了答案,问题也没有真正解决"在根"(编码).这是我的页面编码:

<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
Run Code Online (Sandbox Code Playgroud)

该数据库具有:utf8_general_ci

对我来说似乎完全没问题.

Ole*_*kov 38

确保正确指定了脚本的编码(在<script>标记中或页面的标题/元中,如果它是嵌入的)或指定具有\uNNNN始终明确解析为某些特定Unicode代码点的语法的符号.

例如:

str.replace(/\u00e4/g, "ae")
Run Code Online (Sandbox Code Playgroud)

无论为您的页面/脚本设置什么编码,即使它不正确,也总是将ä替换为ae.

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

// Ü, ü     \u00dc, \u00fc
// Ä, ä     \u00c4, \u00e4
// Ö, ö     \u00d6, \u00f6
// ß        \u00df
Run Code Online (Sandbox Code Playgroud)


Fid*_*nzo 8

这是一个替换最常见的字符以生成Google友好SEO网址的功能:

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;
}
Run Code Online (Sandbox Code Playgroud)


And*_*ter 6

如果您想巧妙地尊重此案来代替德国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)))
Run Code Online (Sandbox Code Playgroud)

它会:

  • Übung-> Uebung
  • ÜBUNG-> UEBUNG
  • üben-> ueben
  • einüben-> einueben
  • 爱因本->爱因本
  • 和Ä,Ö相同
  • 简单的ß-> ss