这是代码。您可以在 Chrome(F12) 中进行测试:
"µ".toUpperCase()
这会返回一个不可见的字符,这应该是“µ”。它在 IE 中运行良好。但为什么?
在 Chrome 中,返回""
(不是空字符串,一个不可见字符)
在 IE 中,返回"µ"
在 Firefox 中,返回"M"
(不是字母 M)
这是代码。您可以在 Chrome(F12) 中进行测试:
"µ".toUpperCase()
这会返回一个不可见的字符,这应该是“µ”。它在 IE 中运行良好。但为什么?
在 Chrome 中,返回""
(不是空字符串,一个不可见字符)
在 IE 中,返回"µ"
在 Firefox 中,返回"M"
(不是字母 M)
正确的结果是“Μ” U+039C 希腊大写字母 MU。它的字形与任何包含两者的普通字体中的拉丁字母“M”相同,但它当然仍然是不同的字符(在比较、转换等方面)。
根据ECMAScript标准(第 15.5.4.18 条),toUpperCase
应根据Unicode字符数据库工作。其中,“µ” U+00B5 MICRO SIGN 的大写映射为 U+039C。这背后的原因是,在 Unicode 中,微符号被视为希腊字母 mu 的单独编码形式;正式地,一个兼容性字符,其兼容性等同于 U+03BC GREEK SMALL LETTER MU。(“μ”和“μ”这两个字符实际上可能在字体中具有不同的字形,但这不会改变它们的形式属性。)
因此,Firefox 是正确的,IE 和 Chrome 在这种情况下是错误的。Chrome返回的值是U+009C,一个控制字符,没有意义,所以这显然是一个无意的bug,一个编码错误。IE 行为可能是故意错误的,因为在实践中,微符号永远不应该大写。(所以 Unicode 规则在这个问题上是荒谬的,但它仍然是要求符合实现的规则。)
解决方案是包含微符号的文本不应大写。微型符号旨在用于国际单位制 (SI) 的符号中,这种符号通常不应该大写。大写,比如“µs”不仅会将微前缀更改为希腊语 Μ,这看起来像兆前缀的符号,而且还会将秒更改为 siemenses。