15

当我使用 JavaScript 设置 HTML 页面的标题时,我看到了一些奇怪的行为。如果我将 html 字符引用直接插入到标题中,则 Unicode 会正确呈现,例如:

<title>&#21543;&#20986;</title>

但是,如果我尝试通过 JavaScript 使用 html 字符引用,则似乎有些东西正在将 & 转换为 (& amp ;) (将它们分开,因此 SO 不只是将其转回 & 号),从而破坏了编码,导致它成为呈现为完整的编码字符串:

function execTitleChange() {
  document.title = "&#21543;&#20986;";
}

(我应该注意到,这只是一种推测;当我在执行这个 JavaScript 函数后使用 Firebug 内省 DOM 时,我看到的是 & 而不是 &。)

如果我在从 JavaScript 设置值时使用 \u 编码的 Unicode 字符,那么一切都会再次正常工作:

function execTitleChange() {
  document.title = "\u5427\u51fa";
}

\u 编码字符的工作对我来说有点道理,因为我认为这就是 JavaScript 表示 Unicode 字符的方式,但我很难理解为什么在使用 html 字符引用时行为会有所不同。

4

2 回答 2

26

JavaScript 字符串常量由 JavaScript 解析器解析。HTML 标记内的文本由 HTML 解析器解析。这两种语言(以及它们的解析器)是不同的,特别是它们通过字符代码表示字符的方式不同。

因此,您所发现的是实际情况:-) 在 JavaScript 中使用转义符号,在 HTML/XML 中\u使用 HTML 实体 ( )。&#nnnn;

编辑——现在当您谈论JavaScript 创建/插入 HTML 时,情况会变得更加混乱。当您使用.innerHTMLJavaScript 更新 DOM 时,您基本上是将 HTML 源代码交给 HTML 解析器进行解释。出于这个原因,您可以使用 JavaScript\u转义或 HTML 实体,一切都会奏效(除了字符编码不匹配等令人痛苦的问题)。

最后,请注意 JavaScript 还提供了String.fromCharCode()从数字字符代码构造字符串的功能。

于 2012-08-24T18:05:25.777 回答
6

在 JavaScript 中处理 Unicode 字符的最佳方法是使用字符本身,使用编辑器或其他可以将它们存储为 UTF-8 编码的工具。你会避免很多混乱。自然,您需要正确声明 .js 或 .html 文件的字符编码。

该构造&#21543;在 JavaScript 中没有特殊含义;它只有八个 Ascii 字符。但是如果您的 JavaScript 代码已经嵌入到 HTML 文档中,那么它将在传递给 JavaScript 解释器之前由 HTML 规则处理。并且规则因 HTML 版本而异。避免这种结构的另一个原因。

所以只写

document.title = "吧出";

(当然,在极少数情况下,您应该title在 JavaScript 中更改元素内容(这对搜索引擎和许多其他目的至关重要),而不是在 HTML 中设置。但这无关紧要。)

于 2012-08-24T19:32:52.293 回答