【问题标题】:IE8 doesn't handle ignoreCase RegExps in greekIE8 不处理希腊语的 ignoreCase RegExps
【发布时间】:2013-10-25 08:30:55
【问题描述】:

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

<!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。

【问题讨论】:

标签: javascript regex internet-explorer-8 internationalization


【解决方案1】:

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

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

哪种变体是正确的不过,我不能说,因为我不知道ς 的大写规则。

【讨论】:

    【解决方案2】:

    好吧,我所有可用的 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 版本不会出错,所以我不能向您保证这将是您问题的最终解决方案,我希望它是;)

    【讨论】:

      【解决方案3】:

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

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-21
        • 2017-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-23
        • 1970-01-01
        相关资源
        最近更新 更多