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

带有重音字符的javascript编码问题,javascript,utf-8,character-encoding,Javascript,Utf 8,Character Encoding,我有一个带有UTF-8标题的页面: <meta charset="utf-8" /> 如果我这样做 <script type="text/javascript" charset="utf-8"> var a = "Ä"; alert(a); </script> 那么,如何解释这种行为以及如何修复警报? 据我所知,一切都是UTF-8,字典和页面编码都很好。问题发生在Javascript中 从表中可以看出,Javascript将字符解析为数值。我使用了

我有一个带有UTF-8标题的页面:

<meta charset="utf-8" />
如果我这样做

<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 
(FWIW:字符实体
和#228;
ä
,而不是
Ä


这与字符编码无关。您将HTML实体输出到JavaScript字符串,然后要求浏览器显示该JavaScript字符串,而不做任何解释HTML的操作(通过
警报
)。就好像你真的键入了:

<h1>&#228;</h1>
…这不会。HTML实体没有在任何理解HTML实体的地方使用<代码>警报
不解释HTML

但如果你这样做了:

<script>
var a = "&#228;";
var div = document.createElement('div');
div.innerHTML = a;
document.body.appendChild(div);
</script>
…然后在HTML上下文中使用
a
(如上所述),您将在文档中获得
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("&#228;")); // ä


*为什么“大部分”:JavaScript字符串由16位“字符”组成,对应于UTF-16代码单元,而不是Unicode代码点(您不能以16位存储Unicode代码点,您需要21位)。来自fit的所有字符都在一个UTF-16代码单元内,但来自的字符要求一个字符有两个UTF-16代码单元。其中一个字符将占据JavaScript字符串中的两个“字符”。对他们来说,上述功能将失败。更多信息请参见和。

“Javascript将字符解析为其数值”-否。字符引用将由服务器端代码生成。当您将其输出为HTML时,它看起来是正常的,因为字符引用在HTML中有特殊的含义(但在JavaScript中没有)。好的,那么我如何才能让警报表现为我键入它的样子呢?这(大概是)umbraco字典的问题,我以前从未听说过。这与字符编码无关。这很可能是umbraco字典的问题,但字典在所有语言中都能很好地工作,警报也能很好地工作,即使在日语、汉语、,阿拉伯文等。问题只在于javascriptYes中的重音字符,这是有效的,但我不能说我完全理解它。我发现创建一个div元素并使用内置html解析器打印一个字符远远不够elegant@Nick:TJC并不是真正告诉您如何解决问题,而是解释下面发生的事情。你可能需要仔细阅读,直到你完全理解为止。然后你就可以想办法了。@Nick:当然不是;我只是想说明,这里真正的问题是您得到的是一个HTML实体(
ä;
),因此您需要在HTML上下文中对其进行解释,以便将其呈现为
Ä
。我刚刚在答案中添加了一些东西,如果您总是使用十进制数字实体,并且希望在JavaScript而不是HTML中使用它们。
chr  HexCode  Numeric   HTML entity     escape(chr)  encodeURI(chr) 

ä    \xE4     &#228;    &auml;          %E4          %C3%A4 
<h1>&#228;</h1>
<script>
var a = "&#228;";
alert(a);
</script>
<script>
var a = "&#228;";
var div = document.createElement('div');
div.innerHTML = a;
document.body.appendChild(div);
</script>
var a = "@library.GetDictionaryItem("A")";
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;")); // ä