带有重音字符的javascript编码问题

时间:2014-04-01 10:51:14

标签: javascript utf-8 character-encoding

我有一个包含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>

警告打印:

&#228;

如果我这样做

<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     &#228;    &auml;          %E4          %C3%A4 

1 个答案:

答案 0 :(得分:2)

(FWIW:字符实体&#228;ä,而不是Ä。)

这与字符编码无关。您正在将HTML 实体输出到JavaScript字符串,然后要求浏览器显示该JavaScript字符串,而不执行任何解释HTML的操作(通过alert)。它就像你实际打字一样:

<h1>&#228;</h1>

...(将在页面上显示ä)和

<script>
var a = "&#228;";
alert(a);
</script>

......赢得了胜利。 HTML实体不能在任何理解HTML实体的地方使用。 alert无法解释HTML。

但如果你这样做了:

<script>
var a = "&#228;";
var div = document.createElement('div');
div.innerHTML = a;
document.body.appendChild(div);
</script>

...您已在网页上看到该字符,因为我们正在向该实体提供将解释HTML的内容(innerHTML)。所以如果你做第一行:

var a = "@library.GetDictionaryItem("A")";

...然后在HTML上下文中使用a(如上所述),您将在文档中获得ä

如果总是从Umbraco获取十进制数字字符实体(如&#228;),因为那些定义了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("&#228;")); // ä

Live Example

*为什么&#34;主要是&#34;:JavaScript字符串由16位&#34;字符&#34;组成。对应于UTF-16 代码单元,而不是Unicode代码点(您不能以16位存储Unicode代码点,需要21位)。 Basic Multilingual Plane中的所有字符都符合一个UTF-16代码单元,但Supplementary Multilingual PlaneSupplementary Ideographic Planeand so on中的字符需要两个 UTF-一个字符的16个代码单元。其中一个角色将占据两个&#34;字符&#34;在JavaScript字符串中。上面的函数对他们来说是失败的。 the JavaScript specthe Unicode FAQ中的更多内容。