Javascript的String原型方法toUpperCase()
是否会在每个支持UTF-8的语言/字符集中提供自然预期的结果?
我尝试过简体中文,韩文,泰米尔语,日语和西里尔语,到目前为止结果似乎合情合理。我可以依赖语言安全的方法吗?
示例:
"イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス".toUpperCase()
> "イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス"
编辑:正如@Quentin所指出的,还有一个String.prototype.toLocaleUpperCase()
甚至可能更安全"使用,但我还必须支持IE 8及更高版本,以及基于Webkit的浏览器。由于它是ECMAScript 3 Standard的一部分,它应该可以在所有这些浏览器上使用,对吧?
有没有人知道使用它会产生自然意外结果的任何情况?
答案 0 :(得分:7)
你期待什么?
JavaScript的toUpperCase()
方法应该使用Unicode标准定义的“区域设置不变大写映射”。所以,基本上,"i".toUpperCase()
在所有情况下都应该是I
。如果区域设置不变大写映射由多个字母组成,则大多数浏览器不会正确地大写它们,例如"ß".toUpperCase()
通常不是SS
。
此外,还有一些语言环境具有与世界其他地方不同的大写规则,最值得注意的例子是土耳其语,其中i
的大写版本为İ
(反之亦然)和I
的小写版本为ı
(反之亦然)。
如果您需要这种行为,则需要设置为土耳其语区域设置的浏览器,并且必须使用toLocaleUpperCase()
方法。
另请注意,某些书写系统有第三种情况,即“标题案例”,当您想要“大写”它时,它会应用于单词的第一个字母。这也是由Unicode标准定义的(例如,绑定nj
的标题大小写为Nj
,而大写字母为NJ
),但(据我所知)不是适用于JavaScript。因此,如果您尝试使用substring
和toUpperCase
对单词进行大写,则在极少数情况下会出现错误。
答案 1 :(得分:2)
是。来自the spec:
[返回]一个字符串,其中每个字符都是Unicode 大写相当于[输入]或的相应字符 如果没有Unicode大写,则[输入]的实际对应字符 等价物存在。
出于此操作的目的,16位代码单元 字符串被视为Unicode Basic Multilingual中的代码点 飞机。代理点代码直接从[输入到 输出]没有任何映射。
必须根据中的案例映射派生结果 Unicode字符数据库(这显然不仅包括 UnicodeData.txt文件,也是SpecialCasings.txt文件 在Unicode 2.1.8及更高版本中随附。
因此虽然这可能与您的语言期望不完全匹配(因为许多语言使用相同的字符但不一定以相同的方式),它确实提供了Unicode中指定的自然期望的结果角色数据库。