日期:2014-05-17  浏览次数:20582 次

html 实体编码问题

????? 看到一篇有趣的文章 ,关于表单提交确实没有尝试过这种设置,一般设置html的meta以及页面为gbk或utf-8编码,那么表单中的中文会以gbk或utf-8编码后在网络上以ascii传播,或者手工构造url用encodeURIComponent utf-8提交。


?????? 而在上面文章中,设置页面编码为 text/html; charset=ISO-8859-1,如这里的 google (默认下google 为utf-8编码),填写中文(某些浏览器?待测)提交后实际上因为中文没有在 iso-8859-1 的对应编码导致浏览器将中文字符的html entity 编码提交到服务器去了(服务器是否会自动转换?待测)。


??????? 大家熟悉的 < > ,空白等对应有实体名 &lt; ,&gt; &nbsp;,实际上所有字符都对应有实体,只不过大多数字符只有 entity number,而没有entity name ,entity number 的规则为


??????? &# (加上) 字符的unicode编码十进制 (加上) ;

?


??????? 如上例的google,firefox提交"我"结果为:q=%26%2325105%3B ,%26为&,%23为#,25105为“我”的unicode码点值,%3b为;

?

updated 2010-11-24

?

根据介绍 xml 特殊字符输入的提示:

?

http://www.regular-expressions.info/unicode.html


XML Schema ? does not have a regex token for matching Unicode code points. However, you can easily use XML entities like? &#xFFFF; ? to insert literal code points into your regular expression.

?

?

实体数字也可以指定16进制,那么这时格式为


&# (加上) x (加上) 字符的unicode编码16进制 (加上) ;


例如: &#0061; 表示 = ,而 &#x0061; 表示 a

?

???????? 如不涉及变量逻辑,实际上以往的js向html写入特殊字符 "\uxxxx",可以替换为 "&#yyyyy",区别是 xxxx必须为16进制且为4位(必要时0填充),而yyyyy是不限位数的十进制数。



PS: javascript获得字符编码


?? javascript 中除了 encodeURI系列,以及被废弃的escape(强烈不建议用,也不知道能用在什么地方),String.prototype.charCodeAt可以很方便的获得字符串中某个位置字符的unicode十进制编码 ,结合String.fromCharCode 可以等价与 java 中的 getBytes 和 new String 的 unicode 应用。十六进制与10进制之间的转换可以用Number.prototype.toString(radix)进行处理。

?

?

PS2: textarea 中 html 内容编码问题

?

另一点要注意的是:由于 textarea 以及写它在页面中指定的值可以编码也可以不编码,一般情况下效果差别不大:

?

<textarea> <b>b</b></textarea>


<textarea> &lt;b&gt;b&lt;/b&gt;</textarea>

?

?

其实保险情况下,应该编码,否则可能会导致意外终结 textarea 。

?

<textarea> xx</textarea></textarea>
?

但是当用户输入或程序设置 &lt;b&gt; 为 textarea 内容时就有显著差别了:

?

提交到数据库中,存的是? &lt;b&gt;

?

但是如果原封不动输出到页面中时:

?

<textarea>
&lt;b&gt;
</textarea>

?实际上 textarea 里面的内容会被首先 decodeHtml 后作为 textarea 的值,显示在输入文本框中则是:

?

<b>

?

而不是用户先前输入的

?

&lt;b&gt;

?

这时