带有重音字符的javascript编码问题
我有一个带有UTF-8标题的页面:带有重音字符的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将字符解析为数值。我使用了
<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 ä ä %E4 %C3%A4
(FWIW:字符实体和#228;
是ä
,而不是Ä
)
这与字符编码无关。您将HTML实体输出到JavaScript字符串,然后要求浏览器显示该JavaScript字符串,而不做任何解释HTML的操作(通过
警报)。就好像你真的键入了:
<h1>ä</h1>
…这不会。HTML实体没有在任何理解HTML实体的地方使用<代码>警报
不解释HTML
但如果你这样做了:
<script>
var a = "ä";
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("ä")); // ä
*为什么“大部分”: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 ä ä %E4 %C3%A4
<h1>ä</h1>
<script>
var a = "ä";
alert(a);
</script>
<script>
var a = "ä";
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("ä")); // ä