これがコードです。Chrome(F12)でテストできます:
"µ".toUpperCase()
これは非表示の文字を返します。これは "µ" である必要があります。IEでは問題なく動作します。しかし、なぜ?
Chrome では、戻り値""
(空の文字列ではなく、非表示の文字)
IE では、戻り値"µ"
Firefox では、戻り値"M"
(文字 M ではありません)
これがコードです。Chrome(F12)でテストできます:
"µ".toUpperCase()
これは非表示の文字を返します。これは "µ" である必要があります。IEでは問題なく動作します。しかし、なぜ?
Chrome では、戻り値""
(空の文字列ではなく、非表示の文字)
IE では、戻り値"µ"
Firefox では、戻り値"M"
(文字 M ではありません)
正しい結果は「Μ」 U+039C GREEK CAPITAL LETTER MU です。そのグリフは、両方を含む通常のフォントのラテン文字「M」と同じですが、もちろん、(比較、変換などで) 別の文字です。
ECMAScript標準 (15.5.4.18 節) によれば、 Unicode Character DatabasetoUpperCase
に従って動作するものとします。その中で、「μ」U+00B5 MICRO SIGN の大文字マッピングは U+039C です。この背後にある理由は、Unicode では、マイクロ記号はギリシャ文字の mu の個別にコード化された形式と見なされるためです。正式には、U+03BC GREEK SMALL LETTER MU と互換性がある互換文字。(2 つの文字 "µ" と "μ" は、実際にはフォント内で異なるグリフを持っている場合がありますが、これは形式的なプロパティを変更しません。)
したがって、この場合、Firefox は正しく、IE と Chrome は誤りです。Chrome が返す値は制御文字である U+009C であり、意味をなさないため、これは明らかに意図しないバグであり、コーディング エラーです。IE の動作は、実際にはマイクロ記号を大文字にするべきではないため、意図的に誤っている可能性があります。(したがって、Unicode ルールはこの問題ではばかげていますが、適合する実装を適用する必要があるというルールは依然としてあります。)
解決策は、マイクロ記号を含むテキストを大文字にしないことです。マイクロ記号は、国際単位系 SI の表記法で使用することを意図しており、そのような表記法は一般に大文字にすべきではありません。たとえば、「µs」を大文字にすると、マイクロ プレフィックスがメガ プレフィックスの記号のように見えるギリシャ語の μ に変わるだけでなく、秒もシーメンスに変更されます。