【问题标题】:What's the default value of the charset attribute of a script tag?脚本标签的字符集属性的默认值是多少?
【发布时间】:2016-07-29 19:20:12
【问题描述】:

假设我有一个这样的脚本: <script type="text/javascript" src="myScript.js">

我在网上看到一些消息来源声称如果省略 charset 属性,则默认为 ISO-8859-1。我看到其他人声称它采用与包含脚本标记的 HTML 页面相同的编码。真相是什么?

我需要知道,因为我的 JavaScript 文件包含将插入 HTML 的文字字符串,其中包括非 ASCII 字符,如欧元符号 (€)。我意识到添加 charset 属性或仅对这些字符进行 HTML 编码应该可以解决我的问题,但我仍然想了解默认行为。

编辑:为了澄清一点,我不仅需要了解标准的内容,还需要了解浏览器的实际行为。此处描述的行为:http://joconner.com/2008/09/javascript-file-encoding/ 似乎表明浏览器总是假定 ISO-8859-1。

【问题讨论】:

  • 我希望默认行为取决于您的 server 而不是任何“封闭”内容中定义的字符集。不过我不确定这一点,所以我将其作为评论而不是答案发布。
  • IIRC,浏览器默认为“脚本出现的页面的编码,有时即使字符集另有说明”。虽然我没有权威来源,所以我很犹豫是否将其作为答案..
  • @Ben Poole:当您说它依赖于服务器时,您是指服务器发送的 HTTP 标头还是其他什么?我的意思是,最终是网络浏览器必须弄清楚如何阅读脚本,对吧?
  • HTTP 标头是;大多数服务器都有默认配置。

标签: html character-encoding


【解决方案1】:

w3c 有一个浏览器确定字符编码的标准方法,您可以在这里阅读:http://www.w3.org/TR/html4/charset.html#spec-char-encoding

总而言之,符合标准的用户代理必须 遵守以下优先事项时 确定文件的性质 编码(从最高优先级到 最低):

  1. “内容类型”字段中的 HTTP“字符集”参数。
  2. “http-equiv”设置为“Content-Type”且值设置为“charset”的 META 声明。
  3. 在指定外部资源的元素上设置的 charset 属性。

除此之外 优先级列表,用户代理可以 使用启发式和用户设置。为了 例如,许多用户代理使用 启发式区分各种 用于日文文本的编码。 此外,用户代理通常具有 用户可定义,本地默认 他们应用的字符编码 没有其他指标。

【讨论】:

  • 感谢您的回答。不过,我对此有点困惑。这是说 HTML 页面的 HTTP charset 参数会覆盖 script 元素的 charset 属性吗?如果是这样,charset 属性似乎不是很有用。或者也许只有脚本调用本身的 HTTP 标头优先于其 charset 属性。
  • @Tim:它引用的只是脚本文件本身的响应头。
  • 谢谢马丁。我从中得到的是我需要确保在脚本的 HTTP 标头或脚本元素的 charset 属性中设置了一个字符集,否则所有的赌注都被取消了。我接受这个作为答案。
【解决方案2】:

根据w3schools.com,该值为 ISO-8859-1,所有主流浏览器都支持此功能。

根据HTTP 1.1 specification

当发送方未提供明确的字符集参数时,“text”类型的媒体子类型被定义为在通过 HTTP 接收时具有“ISO-8859-1”的默认字符集值。除“ISO-8859-1”或其子集以外的字符集中的数据必须用适当的字符集值标记。有关兼容性问题,请参阅3.4.1 部分。

因此,任何不符合此规范的内容在技术上都不符合 HTTP 1.1 规范。

【讨论】:

  • 该链接是 w3schools,据我所知,它不隶属于 W3C(尽管名称相似)。
  • 根据 W3C 标准,这可能是正确的行为,但这个描述似乎表明行为并不总是被遵循:joconner.com/2008/09/javascript-file-encoding
  • 我相信 HTTP 规范指的是 HTTP 标头中的 charset 参数,而不是脚本标签的 charset 属性。
  • 我还从 W3C 的 HTML4 建议中注意到这一点(链接自 Martin Jespersen 的回答)The HTTP protocol ([RFC2616], section 3.7.1) mentions ISO-8859-1 as a default character encoding when the "charset" parameter is absent from the "Content-Type" header field. In practice, this recommendation has proved useless because some servers don't allow a "charset" parameter to be sent, and others may not be configured to send the parameter. Therefore, user agents must not assume any default value for the "charset" parameter.
  • 在您信任他们的网站之前,请先查看www.w3fools.com
【解决方案3】:

HTML5 4.11.1 脚本元素

如果脚本元素具有 charset 属性,则令该脚本元素的脚本块的字符编码为从 charset 属性的值中获取编码的结果。

否则,让脚本块对此脚本元素的后备字符编码与文档本身的编码相同。

引用链接到 DOM document 元素,该元素具有 encoding 属性。

TODO:找出该对象的编码是如何根据标准确定的。

【讨论】:

    【解决方案4】:

    HTML 编码字符串并将它们传递给 javascript 变量可能会导致问题,特别是如果您使用十六进制代码,因为我听说 js 更喜欢八进制。

    如果您可以使用 utf-8 作为网页的字符集,那么 js 可以很好地处理这些字符集。我经常使用它,从来不需要为包含的脚本文件定义字符集。

    【讨论】:

    • 不幸的是,我无法控制 HTML 页面本身的字符集,因为这是由我们的客户端控制的。我只是添加脚本。事实上,他们在网站的不同页面上使用不同的编码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    相关资源
    最近更新 更多