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+03C2Unicode 1.1 以降に存在する Unicode コードポイントの 16 進値です。

このための Unicode 文字データ (UCD) エントリSpecialCasing.txtは次のとおりです。

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

U+03A3ギリシャ語の大文字のシグマ ( Σ) です。これは、少なくとも Unicode 2.1 Update 3 ( http://www.unicode.org/Public/2.1-Update3/SpecialCasing-1.txt ) までさかのぼって定義されているため、IE8 はケース マッピングをサポートする必要があります。

したがって、Σは の正しい大文字表記ですς

toUpperCaseおよびtoLocaleUpperCase関数の MSDN ドキュメントには、どちらも Unicode の大文字と小文字のマッピングを使用すると書かれています。このtoLocaleUpperCase関数は、現在のシステム ロケールと競合する場合 (トルコ語のマッピングなど)、システム ロケールのケース マッピングを使用します。したがって、Unicode のケース マッピングだけが必要な場合は、 を使用する必要がありますtoUpperCase

于 2013-11-03T07:46:14.287 に答える
1

利用可能な IE のすべてのバージョンは、を使用している場合でもΜάρτιος常に に変換されます。ΜΆΡΤΙΟς.toUpperCase()

I assume the problem are the variants of some letters (http://de.wikipedia.org/wiki/Griechisches_Alphabet#Klassische_Zeichen).

For example the letters Σ σ Ϲ and ς are all a 'Sigma'. The first both are the classic ones, the other are variants. Another example would be Β, β and ϐ for 'Beta'.

To ensure that these variants are recognized i'd recommend a substition before creating the regex.

Here I made a short (possible incomplete) helper function to do this

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

This function converts your strings to

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

These strings allows different variants of the same letter. I'm sure, this is grammatically incorrect, but it should be more solid to match the strings.

In your code you've to replace

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

with

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

私が言ったように、私のバージョンの IE ではエラーが発生しないため、これが問題の最終的な解決策になるとは約束できませんが、そうであることを願っています ;)

于 2013-11-02T10:25:25.123 に答える