6

这是代码。您可以在 Chrome(F12) 中进行测试:

"µ".toUpperCase()

这会返回一个不可见的字符,这应该是“µ”。它在 IE 中运行良好。但为什么?

在 Chrome 中,返回""(不是空字符串,一个不可见字符)
在 IE 中,返回"µ"
在 Firefox 中,返回"M"(不是字母 M)

4

1 回答 1

6

正确的结果是“Μ” 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。

于 2013-10-10T06:01:01.073 回答