7

如果我取一些希腊月份名称并从中制作不区分大小写的正则表达式,它们将与大写的同一月份不匹配:

<!doctype html>
<html>
<head>
</head>
<body>
<pre></pre>
<script>
    var names = [
        'Μάρτιος',
        'Μάιος',
        'Ιούνιος',
        'Ιούλιος',
        'Αύγουστος',
        'Νοέμβριος'
    ];
    var pre = document.getElementsByTagName('pre')[0];
    var i;
    for (i = 0; i < names.length; ++i) {
        var m = names[i];
        var r = new RegExp(m, 'i');
        pre.innerHTML += m + ' ' + r.test(m.toLocaleUpperCase()) + '\n';
    }
</script>
</body>
</html>

在 Ie8 中,这会打印名称,然后打印为 false。在其他浏览器中它打印为 true。

4

3 回答 3

5

只需使用.toUpperCase()而不是.toLocaleUpperCase().

后者翻译ΜάρτιοςΜΆΡΤΙΟΣ,前者翻译成ΜΆΡΤΙΟς

但是,我不能说哪个变体是正确的,因为我不知道ς.

于 2013-10-25T09:12:00.617 回答
1

ς\xCF\x82UTF-8 或U+03C2作为自 Unicode 1.1 以来一直存在的 Unicode 代码点的十六进制值。

用于此的 Unicode 字符数据 (UCD) 条目SpecialCasing.txt是:

# <code>; <lower> ; <title> ; <upper> ; (<condition_list> ;)? # <comment>
03A3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK CAPITAL LETTER SIGMA

哪里U+03A3是希腊大写字母 Sigma ( Σ)。这至少可以追溯到 Unicode 2.1 Update 3 ( http://www.unicode.org/Public/2.1-Update3/SpecialCasing-1.txt ),因此 IE8 应该支持大小写映射。

因此,Σ是 的正确大小写ς

toUpperCasetoLocaleUpperCase函数的 MSDN 文档说两者都使用 Unicode 大小写映射。toLocaleUpperCase如果与当前系统语言环境发生冲突(例如,对于某些土耳其语映射),该函数使用系统语言环境大小写映射。因此,如果您只想要 Unicode 大小写映射,您应该使用toUpperCase.

于 2013-11-03T07:46:14.287 回答
1

好吧,我所有可用的 IE 版本Μάρτιος总是转换为ΜΆΡΤΙΟς,即使使用.toUpperCase().

我认为问题是某些字母的变体(http://de.wikipedia.org/wiki/Griechisches_Alphabet#Klassische_Zeichen)。

例如,字母 Σ σ Ϲ 和 ς 都是“Sigma”。第一个都是经典的,另一个是变体。另一个例子是“Beta”的 Β、β 和 ϐ。

为了确保识别这些变体,我建议在创建正则表达式之前进行替换。

在这里,我制作了一个简短的(可能不完整的)辅助函数来执行此操作

function regextendVariants(s)
{
    var variants = [
        ['β', 'ϐ'],
        ['ε', 'ϵ'],
        ['θ', 'ϑ'],
        ['κ', 'ϰ'],
        ['π', 'ϖ'],
        ['ρ', 'ϱ'],
        ['σ', 'Ϲ', 'ς'],
        ['φ', 'ϕ']
    ];

    for (var j = 0; j < variants.length; j++) {
        var variant = variants[j];
        for (var k = 1; k < variant.length; k++) {
            s = s.replace(variant[k], '['+variant.join('')+']');
        }
    }

    return s;
}

此函数将您的字符串转换为

  • Μάρτιο[σϹς]
  • Μάιο[σϹς]
  • Ιούνιο[σϹς]
  • Ιούλιο[σϹς]
  • Αύγουστο[σϹς]
  • Νοέμβριο[σϹς]

这些字符串允许相同字母的不同变体。我敢肯定,这在语法上是不正确的,但匹配字符串应该更可靠。

在您的代码中,您必须替换

var r = new RegExp(m, 'i');

var r = new RegExp(regextendVariants(m), 'i');

正如我所说,我的 IE 版本不会出错,所以我不能向您保证这将是您问题的最终解决方案,我希望它是;)

于 2013-11-02T10:25:25.123 回答