【问题标题】:Is Javascript's toUpperCase() language safe?Javascript 的 toUpperCase() 语言安全吗?
【发布时间】:2015-06-10 17:06:19
【问题描述】:

Javascript 的 String 原型方法 toUpperCase() 是否会在每种支持 UTF-8 的语言/字符集中提供自然预期的结果?

我尝试过简体中文、韩文、泰米尔文、日文和西里尔文,目前看来结果还算合理。我可以依赖这种语言安全的方法吗?

例子:

  "イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス".toUpperCase()
> "イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス"

编辑:正如@Quentin 指出的那样,还有一个String.prototype.toLocaleUpperCase() 使用起来可能更“安全”,但我还必须支持 IE 8 及更高版本,以及基于 Webkit 的浏览器。由于它是 ECMAScript 3 标准的一部分,它应该可以在所有这些浏览器上使用,对吧?

有谁知道使用它会自然产生意想不到的结果的任何情况?

【问题讨论】:

  • “否”在这里是一个安全的选择。有 很多 种语言使用 UTF-8 字符,其中许多甚至没有大写或小写字符的概念。
  • 顺便说一句:请礼貌地告知您的 Windows XP 用户,如果没有安全更新,他们 (98% 可能) 成为全球僵尸网络的一部分,这使得网络工程师的工作变得更加困难。
  • @Katana314 不相关的旁白。你为什么要加班?
  • @connexo 好吧,因为您提到您支持 IE8 及更高版本。带有安全更新的 Windows 7 将在 IE11 上运行,因此支持 IE8 的最常见原因是 Windows XP。我通常不会指出诸如“你的图像应该有一个alt!”之类的小问题。但是对于相当大的问题,人们通常至少提供简短的评论以确保他们知道;或者也许将其作为注释包含在他们的答案中。

标签: javascript string


【解决方案1】:

你期待什么?

JavaScript 的toUpperCase() 方法应该使用Unicode 标准定义的“区域设置不变大写映射”。所以,基本上,"i".toUpperCase() 在所有情况下都应该是I。在区域设置不变的大写映射由多个字母组成的情况下,大多数浏览器不会正确地将它们大写,例如"ß".toUpperCase() 通常不是SS

此外,有些语言环境的大写规则与世界其他地区不同,最著名的例子是土耳其语,其中i 的大写版本是İ(反之亦然),@ 的小写版本987654328@ 是 ı(反之亦然)。

如果您想要这种行为,您将需要一个设置为土耳其语言环境的浏览器,并且您必须使用 toLocaleUpperCase() 方法。

另请注意,某些书写系统有第三种情况,即“标题大小写”,当您想“大写”单词时,它会应用于单词的第一个字母。这也是由Unicode标准定义的(例如,连字nj的标题大小写是Nj,而大写是NJ),但(据我所知)不适用于JavaScript。因此,如果您尝试使用 substringtoUpperCase 将单词大写,那么在极少数情况下会出现错误。

【讨论】:

    【解决方案2】:

    是的。来自the spec

    [返回] 一个字符串,其中每个字符都是 Unicode [输入] 或 如果没有 Unicode 大写,则 [输入] 的实际对应字符 存在等价物。

    出于此操作的目的,16 位代码单元的 字符串在 Unicode 基本多语言中被视为代码点 飞机。代理代码点直接从 [input 转移到 输出] 没有任何映射。

    结果必须根据 Unicode 字符数据库(这明确地包括不仅 UnicodeData.txt 文件,还有 SpecialCasings.txt 文件 在 Unicode 2.1.8 及更高版本中随附)。

    因此,虽然这可能不完全符合您的语言 期望(因为许多语言使用相同的字符但不一定以相同的方式),但它确实提供了 Unicode 中指定的自然预期结果字符数据库。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-21
    • 2011-08-20
    • 2018-07-03
    • 2016-06-04
    • 2015-12-31
    • 1970-01-01
    • 2010-11-01
    相关资源
    最近更新 更多