Javascript toUpperCase陷入拉丁字符的铬

sco*_*ott 5 javascript character-encoding

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

"µ".toUpperCase()
Run Code Online (Sandbox Code Playgroud)

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

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

Juk*_*ela 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"不仅会将微前缀更改为希腊语Μ,希腊语Μ看起来像是巨型前缀的符号,但它也会改变秒数到siemenses.