IE8无法处理希腊语不区分大小写的正则表达式

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。

这对我有效:http://i.imgur.com/xt4TMaz.png - Kobi
3个回答

5

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

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

哪个变体是正确的我无法确定,因为我不知道ς的大写规则。


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版本没有错误,所以我不能保证这将是您问题的最终解决方案,但我希望它是;)


1

ς在UTF-8中表示为\xCF\x82,或者是Unicode 1.1版本以来存在的Unicode代码点U+03C2的十六进制值。

这个字符在SpecialCasing.txt中的Unicode字符数据(UCD)条目如下:

# <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


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