如何组合一个字符后跟一个"结合重音"成一个字符?

时间:2014-05-05 16:36:28

标签: javascript unicode utf-8 internationalization

如何将字符后跟“组合重音”组合成单个字符?

我正在使用一个短语,用户进入网页并将其提交到法语 - 英语词典。有时字典查找会失败,因为大多数重音字符有两种表示形式。例如:

  • é可以用一个字符完成:\xE9(带有急性的拉丁文小写字母e。)
  • 但它也有两个字符代表:e + \u0301(结合尖锐的口音)。

我总是希望将前一个(单个字符)提交到字典中。

现在,我正在通过用等效的单个字符替换我找到的每个两个字符的出现来做到这一点。但是,当它从输入字段中获取时,是在JavaScript中还是在浏览器中有更简单(即一行)的方式吗?

function translate(phrase) {
    // Combine accents into a single accented character, if necessary.
    var TRANSFORM = [
        // Acute accent.
        [/E\u0301/g, "\xC9"], // É
        [/e\u0301/g, "\xE9"], // é

        // Grave accent.
        [/a\u0300/g, "\xE0"], // à
        [/e\u0300/g, "\xE8"], // è
        [/u\u0300/g, "\xF9"], // ù

        // Cedilla (no combining accent).

        // Circumflex.
        [/a\u0302/g, "\xE2"], // â
        [/e\u0302/g, "\xEA"], // ê
        [/i\u0302/g, "\xEE"], // î
        [/o\u0302/g, "\xF4"], // ô
        [/u\u0302/g, "\xFB"], // û

        // Trema.
        [/e\u0308/g, "\xEB"], // ë
        [/i\u0308/g, "\xEF"], // ï
        [/u\u0308/g, "\xFC"] // ü

        // oe ligature (no combining accent).
    ];
    for (var i = 0; i < TRANSFORM.length; i++)
        phrase = phrase.replace(TRANSFORM[i][0], TRANSFORM[i][1]);

    // Do translation.
    ...
}

1 个答案:

答案 0 :(得分:8)

这称为normalization,看起来你想要NFC规范化:

  

字符被分解,然后通过规范等价重新组合。

或者换句话说,它用单个字符等效替换任何组合字符。

这是作为String.prototype.normalize内置于ECMAScript 6中的,所以如果您只支持较新的浏览器,则可以执行以下操作:

phrase = phrase.normalize('NFC');

为了支持旧浏览器,看起来这个库可以满足您的需求:
https://github.com/walling/unorm

用法为phrase = UNorm.nfc(phrase)