Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我如何组合一个后跟“的字符?”;“组合重音”;变成一个角色?_Javascript_Unicode_Utf 8_Internationalization_Normalize - Fatal编程技术网

Javascript 我如何组合一个后跟“的字符?”;“组合重音”;变成一个角色?

Javascript 我如何组合一个后跟“的字符?”;“组合重音”;变成一个角色?,javascript,unicode,utf-8,internationalization,normalize,Javascript,Unicode,Utf 8,Internationalization,Normalize,如何将后跟“组合重音”的字符组合成单个字符? 我将用户输入到网页中的一个短语提交给法英词典。有时字典查找会失败,因为大多数重音字符有两种表示形式。例如: é可以用一个字符完成:\xE9(带锐音符的拉丁文小写字母e) 但它也可以用两个字符来表示:e+\u0301(结合尖锐重音) 我总是想把前者(单个字符)交给字典 现在,我正在通过将我找到的每两个字符替换为等效的单个字符来实现这一点。但是,有没有一种更简单(即一行)的方法来实现这一点,无论是在JavaScript中,还是在从输入字段获取时在浏览

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

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

  • é可以用一个字符完成:
    \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.
    ...
}
函数翻译(短语){
//如有必要,将重音组合成单个重音字符。
变量转换=[
//尖锐的口音。
[/E\u0301/g,“\xC9”],//É
[/e\u0301/g,“\xE9”],//
//严肃的口音。
[/a\u0300/g,“\xE0”],//a
[/e\u0300/g,“\xE8”],//è
[/u\u0300/g,“\xF9”],//ù
//塞迪利亚(没有组合口音)。
//扬抑。
[/a\u0302/g,“\xE2”],//-
[/e\u0302/g,“\xEA”],//ê
[/i\u0302/g,“\xEE”],//î
[/o\u0302/g,“\xF4”],//
[/u\u0302/g,“\xFB”],//
//特雷玛。
[/e\u0308/g,“\xEB”],//ë
[/i\u0308/g,“\xEF”],//ï
[/u\u0308/g,“\xFC”]//u
//oe连字(无组合重音)。
];
对于(var i=0;i
这被称为,看起来您想要NFC标准化:

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

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

这是ECMAScript 6中内置的,因此,如果您只支持较新的浏览器,则可以执行以下操作:

phrase = phrase.normalize('NFC');
为了支持较旧的浏览器,该库似乎可以满足您的需要:


用法将是
phrase=UNorm.nfc(phrase)

您可以与函数一起使用,并将匹配简化为单个正则表达式(
[\\u0300\\u0302]
),然后根据所有选项的字典检查匹配情况……如果您正在Java中寻找相同的内容,请:谢谢!我很难找到答案,因为我不知道该怎么称呼它。