当我使用JavaScript设置HTML页面的标题时,我看到了一些奇怪的行为。如果我直接在标题中插入html字符引用,则Unicode呈现正确,例如:
<title>吧出</title>
但是如果我尝试通过JavaScript使用html字符引用,那么似乎正在转换&amp; to(&amp; amp;)(将它们分开,以便SO不会将其转回到&符号),从而破坏编码,使其呈现为完整的编码字符串:
function execTitleChange() {
document.title = "吧出";
}
(我应该注意这是一个小小的猜测;当我在执行这个JavaScript函数后使用Firebug对DOM进行内省时,我就看到&amp;而不是&amp;。)
如果我在设置JavaScript的值时使用\ u编码的Unicode字符,那么一切都能正常工作:
function execTitleChange() {
document.title = "\u5427\u51fa";
}
\ u编码字符对我来说有点意义,因为我认为这是JavaScript代表Unicode字符的方式,但我很难理解为什么在使用html字符引用时行为会有所不同。
答案 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文件的字符编码。
构造吧
在JavaScript中没有特殊含义;它只有八个Ascii字符。但是,如果您的JavaScript代码已嵌入到HTML文档中,那么在传递给JavaScript解释器之前,它将由HTML规则处理。规则因HTML版本而异。避免这种结构的另一个原因。
所以写一下
document.title = "吧出";
(当然,在极少数情况下,您应该更改title
元素内容 - 这对于搜索引擎和许多其他目的至关重要 - 在JavaScript中,而不是在HTML中进行设置。但这不是点。)