我有一个包含UTF-8标题的页面:
<meta charset="utf-8" />
在页面中,我使用umbraco字典来获取各种语言的内容。 当我在页面上用德语打印它时看起来很好:
<h1>@library.GetDictionaryItem("A")</h1>
解析为:
德语 <h1>Ä</h1>
但是,如果我通过脚本输入它:
<script type="text/javascript" charset="utf-8">
var a = "@library.GetDictionaryItem("A")";
alert(a);
</script>
警告打印:
ä
如果我这样做
<script type="text/javascript" charset="utf-8">
var a = "Ä";
alert(a);
</script>
警告打印:
Ä
那么什么可以解释这种行为以及如何修复警报? 据我所知,一切都是UTF-8,字典和页面编码都很好。问题发生在Javascript中。
从我在这里的表中可以看到,Javascript将字符解析为它的数字值。我使用“escape,encodeUrl,decodeUrl”等没有运气。
chr HexCode Numeric HTML entity escape(chr) encodeURI(chr)
ä \xE4 ä ä %E4 %C3%A4
答案 0 :(得分:2)
(FWIW:字符实体ä
为ä
,而不是Ä
。)
这与字符编码无关。您正在将HTML 实体输出到JavaScript字符串,然后要求浏览器显示该JavaScript字符串,而不执行任何解释HTML的操作(通过alert
)。它就像你实际打字一样:
<h1>ä</h1>
...(将在页面上显示ä
)和
<script>
var a = "ä";
alert(a);
</script>
......赢得了胜利。 HTML实体不能在任何理解HTML实体的地方使用。 alert
无法解释HTML。
但如果你这样做了:
<script>
var a = "ä";
var div = document.createElement('div');
div.innerHTML = a;
document.body.appendChild(div);
</script>
...您已在网页上看到该字符,因为我们正在向该实体提供将解释HTML的内容(innerHTML
)。所以如果你做第一行:
var a = "@library.GetDictionaryItem("A")";
...然后在HTML上下文中使用a
(如上所述),您将在文档中获得ä
。
如果总是从Umbraco获取十进制数字字符实体(如ä
),因为那些定义了unicode代码点,而JavaScript(大多数)在其字符串*中使用unicode代码点,你可以很容易地解析实体:
function characterFromDecimalNumericEntity(str) {
var decNumEntRex = /^\&#(\d+);$/;
var match = decNumEntRex.exec(str);
var codepoint = match ? parseInt(match[1], 10) : null;
var character = codepoint ? String.fromCharCode(codepoint) : null;
return character;
}
alert(characterFromDecimalNumericEntity("ä")); // ä
*为什么&#34;主要是&#34;:JavaScript字符串由16位&#34;字符&#34;组成。对应于UTF-16 代码单元,而不是Unicode代码点(您不能以16位存储Unicode代码点,需要21位)。 Basic Multilingual Plane中的所有字符都符合一个UTF-16代码单元,但Supplementary Multilingual Plane,Supplementary Ideographic Plane,and so on中的字符需要两个 UTF-一个字符的16个代码单元。其中一个角色将占据两个&#34;字符&#34;在JavaScript字符串中。上面的函数对他们来说是失败的。 the JavaScript spec和the Unicode FAQ中的更多内容。