JavaScript:比较字符和带重音符号的字符

5

我正在创建一个类似hang man(猜单词)的简单游戏。用户可以输入一个“秘密句子”,然后玩家们必须逐个选择字母来猜出它。

由于这个游戏将用于多种语言,如果玩家选择非重音字符,我希望解决所有重音字符。例如:

IL CANE È BELLO.

如果玩家选择元音字母“e”,那么只有没有重音符号的元音字母才会被解决(游戏使用“===”比较字符)。相反,我希望游戏自动识别所有带或不带重音符号的字符(如è、é、e...)

我正准备编写一个检查每个重音字符的函数,但我想知道是否有更简单的方法。

这是我的函数目前的样子(我只添加了è这个带重音符号的元音字母)

function isAccentedVowel(chosenChar, currentChar) {
    console.log('The user selected this char: ' + chosenChar)
    console.log('I\'m comparing it to this char: ' + currentChar)
    switch (chosenChar) {
        case 'E':
            if (currentChar === 'È') return true;
    }
}

注:秘密句子和每个字符均为大写


1
也许可以考虑使用.charCodeAt(),参见:https://dev59.com/AWEh5IYBdhLWcg3wPhhT,我怀疑那些带重音的字符会落在一个数字范围内,你可能可以利用这一点。不过我不确定。还可以查看这个链接:https://dev59.com/OnNA5IYBdhLWcg3wX8nk。 - Spangle
1
策略模式是你的好朋友。你可以根据用户的语言环境选择策略。这样,你的代码就能保持简洁,而不是有一长串的 switch 语句。 - Mike Doe
你也可以在比较之前使用lodash.deburr,详情请查看:https://lodash.com/docs/4.17.15#deburr - user3025289
2个回答

4
你需要使用 String.prototype.localeCompare () 方法,并将 sensitivity 值设为 "base" 。这样可以做到不区分大小写的比较(我认为你也想要这个功能)。
如果字符匹配,localeCompare() 将返回 0
以下是一个示例,基于你想查找匹配字符的位置的假设(即“猜字游戏”):

const locale = undefined // set this if it matters, otherwise use default
const options = { sensitivity: 'base' }

const findCharPositions = (str, char) => 
  Array.prototype.reduce.call(str, (indexes, c, i) =>
    (c.localeCompare(char, locale, options) || indexes.push(i), indexes), [])

const str = 'IL CANE È BELLO'
console.log('Find "l":', findCharPositions(str, 'l'))
console.log('Find "e":', findCharPositions(str, 'e'))


4
你可以使用String#normalize来将带音调的字符与其正常对应字符进行比较。
为了进行比较,你需要先从带音调的字符中获取/提取正常字符,如下所示。
string.normalize('NFD')

这将返回一个包含两个项目的数组。您现在可以比较数组中的第一个项目与正常字符。

function isAccented(char, accentedChar) {
  return char === accentedChar.normalize('NFD')[0];
}

console.log(isAccented('E', 'È'));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接