如何使用JavaScript在HTML标题中正确插入unicode?

时间:2012-08-24 18:02:19

标签: javascript html unicode

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

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

但是如果我尝试通过JavaScript使用html字符引用,那么似乎正在转换&amp; to(&amp; amp;)(将它们分开,以便SO不会将其转回到&符号),从而破坏编码,使其呈现为完整的编码字符串:

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

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

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

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

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

2 个答案:

答案 0 :(得分:21)

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

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

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

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

答案 1 :(得分:5)

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

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

所以写一下

document.title = "吧出";

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