【问题标题】:JavaScript: Comparing characters and accented charactersJavaScript:比较字符和重音字符
【发布时间】:2019-08-30 04:54:01
【问题描述】:

我正在创建一个简单的刽子手游戏。用户可以输入一个“密句”,然后玩家通过选择一个字母来猜测它。

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

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;
    }
}

注意:密句和每个字符都是大写的

【问题讨论】:

  • 也许看看使用 .charCodeAt() 见:stackoverflow.com/questions/22624379/… ,我怀疑那些重音字符会落在一个数字范围之间,你可以使用它。不过不确定。也看看这个stackoverflow.com/questions/990904/…
  • 策略模式是你的朋友。您根据用户区域设置选择策略。这样你的代码就会保持干净,而不是一公里长的 switch 语句

标签: javascript string diacritics


【解决方案1】:

您可以使用String#normalize 将重音字符与正常字符进行比较。

要进行比较,您需要首先从重音字符中获取/提取正常字符,如下所示。

string.normalize('NFD')

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

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

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

【讨论】:

    【解决方案2】:

    您需要将String.prototype.localeCompare()"base"sensitivity 值一起使用。这具有不区分大小写比较的额外好处(我假设您也会想要)。

    如果你的字符匹配,localeCompare() 返回0

    这是一个假设您希望找到匹配角色位置的示例(即,“hang man” 游戏)

    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'))

    【讨论】:

      猜你喜欢
      • 2017-09-18
      • 1970-01-01
      • 1970-01-01
      • 2017-06-27
      • 2014-08-23
      • 2011-09-28
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多