Javascript toUpperCase陷入拉丁字符的铬

时间:2013-10-10 03:13:20

标签: javascript character-encoding

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

"µ".toUpperCase()

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

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

1 个答案:

答案 0 :(得分:5)

正确的结果是“Μ”U + 039C GREEK CAPITAL LETTER 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,一个控制字符,没有任何意义,所以这显然是一个无意的错误,编码错误。 IE行为可能是故意错误的,因为在实践中,微观标志不应该是大写的。 (因此Unicode规则在这个问题上是荒谬的,但它仍然是规则,需要符合实现才能应用。)

解决方案是包含微标志的文字不应该是大写的。微型标志旨在用于国际单位制SI的符号,并且这种符号通常不应该是大写的。大写,例如,“μs”不仅会将微前缀更改为希腊语Μ,希腊语Μ看起来像是巨型前缀的符号,但它也会改变秒数到西门子。