【问题标题】:Replacing umlauts in JS替换 JS 中的变音符号
【发布时间】:2012-07-24 01:24:41
【问题描述】:

我正在比较字符串,必须替换 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

所以我猜这是编码的某种问题,但正如我在页面上所说的那样,变音符号看起来不错。

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

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

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

数据库有:utf8_general_ci

在我看来完全没问题。

【问题讨论】:

  • 您在数据库中使用什么编码以及在您的网页中使用什么编码?
  • 字符串是什么???记录下来。您的方法可行,但正如您从 indexOf 中看到的,您的字符串不包含“ä”。
  • "bäg".replace(/ä/g, "ae"); // ==&gt; "baeg",所以你的编码可能有问题
  • @Bergi:我记录了字符串,并且 ä 显示在控制台中,在替换之前和之后 - 它肯定存在 :-) 我将编码写入问题,这似乎完全可以我,这就是我选择奥列格答案的原因。非常感谢你们 - 是的,这样问题并没有真正解决“它的根源”

标签: javascript encoding replace


【解决方案1】:

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

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

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

所以通过使用字符串来查看传入的数据。 charCodeAt

检查toLowerCase 之前的字符代码,以确保它不会改变你的东西。您需要逐步调试。

最后,检查编辑器中的字符集设置,确保输入的 ä 是应有的内容。您可能希望通过 UTF8 值指定它,而不是输入 ä、ö 等

【讨论】:

  • 无论你在页面中使用什么编码,在 JS 中一切都是 Unicode 和变音变音将总是具有完全相同的代码。
  • 我认为我的文档编码(我在编辑器中的文件)并不重要,因为文本来自数据库,所以只有数据库和 html 元标记中的编码应该是重要的或不是?而且您的函数格式相当混乱,它应该是 string.charCodeAt(0); (0 是第一个位置),但我真的没有想到它,这是一个很好的线索,不幸的是它没有帮助 - 在 toLowerCase 之前和之后都返回了正确的 unicode。
【解决方案2】:

要么确保正确指定脚本的编码(在&lt;script&gt; 标记中,或者在页面的标题/元数据中,如果它是嵌入的),或者使用\uNNNN 语法指定符号,该语法将始终明确地解析为某些特定的 Unicode 代码点。

例如:

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

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

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

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

【讨论】:

  • 非常感谢,这行得通 :-) 我在页面上有 utf-8 编码: 这对我来说似乎完全正确,所以我将使用它......
  • 这里有更多代码: // Ü, ü \u00dc, \u00fc // Ä, ä \u00c4, \u00e4 // Ö, ö \u00d6, \u00f6 // ß \u00df
  • Å 用于北欧国家: // Å,å: \u00c5, \u00e5
【解决方案3】:

这是一个替换最常见字符以生成 Google 友好 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;
}

【讨论】:

【解决方案4】:

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

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 -> ueben
  • einüben -> einueben
  • 艾努本 -> 艾努本
  • 对于 Ä, Ö 也一样
  • 和简单的 ß -> ss

【讨论】:

    【解决方案5】:

    如果您需要一点 sn-p 将德语变音符号转换为 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;
    }

    【讨论】:

      猜你喜欢
      • 2021-09-02
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 2011-02-03
      相关资源
      最近更新 更多