String.fromCharCode vs&#(charcode)的输出;

时间:2011-10-28 01:13:46

标签: javascript

任何人都可以解释为什么我会看到使用String.fromCharCode(charcode)和打印&#charcode;之间的输出在127到160之间的差异?它似乎在firefox,chrome,mac / win上看,即两者的输出对于数千个其他值都是相同的,但不是该范围内的代码。从fromCharCode()输出字符串会在该范围内创建缺少的字符。

如果您想特别遇到此问题,请参阅以下内容。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" 
"http://www.w3.org/TR/1998/REC-html40-19980424/loose.dtd">
<HTML LANG="en">
<HEAD>
<TITLE></TITLE>
<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<META name="author" content="(cogknight@yahoo.com)">
<META name="date" content="Tue Oct 25 02:35:44 CDT 2011">  
<STYLE TYPE="text/css">
BODY { font-family: helvetica, sans-serif; }
table { border: 1px solid black; }
td { border: 1px solid black; }
</STYLE>
<SCRIPT TYPE="text/javascript">
function init()
{
   var elem = document.getElementById('msg');
   var msg = "<TABLE STYLE='border:1px solid black;'>";
   msg += "<tr><th>code</th><th>fromCharCode</th><th>ampersand</th></tr>";
   var ccode = 0;
   for (;ccode < 180; ccode++)
   {
      msg += "<TR><TD>";
      msg += ccode;
      msg += "</TD><TD>";
      msg += String.fromCharCode(ccode);
      msg += "</TD><TD>";
      msg += "&#" + ccode + ";";
      msg += "</TD</TR>";
   }
   msg += "</TABLE>";

   elem.innerHTML = msg;
}
</SCRIPT>
</HEAD>
<BODY>
<DIV ID="msg">
</DIV>
<SCRIPT>
init();
</SCRIPT>
</BODY>
</HTML>

谢谢你的时间, BBB

2 个答案:

答案 0 :(得分:0)

我在http://jsfiddle.net/E8S9J/上验证了您的输出,至少对于运行Chrome和Mac的Mac而言。

右栏显示邪恶的Windows-1252字符集的输出。

您可以在此处查看0x80-0x9F(128-159)范围内的字符问题:http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT

有趣的是JavaScript String.fromCharCode从代码中生成了正确的字符,但HTML实体却没有。浏览器就是这样做的,即使它们可能不应该这样做。以下是Wikipedia的解释:

  

使用像¡这样的HTML数字字符引用。某些旧浏览器错误地将128-159范围内的代码解释为对本机字符集的引用;但是,数字字符引用是HTML中输入特殊字符的唯一方法,其中没有命名实体,例如土耳其字母。因为代码点128到159不用于ISO-8859-1和Unicode中的可显示字形,所以该范围内的字符引用(例如ƒ)在HTML中是非法的并且是不明确的,尽管它们通常被许多网站使用。几乎所有浏览器都将ISO-8859-1视为Windows-1252,它在该空间中具有可打印字符,并且它们经常在英文项目中找到文章标题,这在尝试创建到所述页面的文章间链接时确实引起了混淆。

我认为浏览器制造商这样做是因为他们认为很多网络作者不理解字符编码,并且无论如何都会使用Windows-1252设置(必须在网络上打击那些旧的MS Word文档)。 HTML本质上非常宽容。即使标记全部被破坏,它也会尽力做到最好。使用该范围内的实体(嘿它们毕竟是控制字符)有点混乱,所以容忍浏览器显示它可以做什么,即使它必须显示作者不想要的字符集中的字形

答案 1 :(得分:0)

128-159不是unicode字符。

我最好的猜测:在javascript-land中,字符被解释为utf-16,因此128-159是一种“合法的非字符”。在HTML-land中,utf-8是王道(假设你使用utf-8),所以the last bit of a single-byte character must always be zero,这意味着那些角色只能高达127(有点像一个符号位)。如果要检查,可以看到二进制中的“10000000”等于128。

因此,在utf-8中,由于编码的机制,具有128-159范围内的字符是不可能的。在utf-16中,即使该范围内不存在任何字符,也可以表示该范围内的字符。

相关问题