`
yiminghe
  • 浏览: 1435079 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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;

 

这时可以知道实体编码对于 textarea 在页面中的回填值(脚本设置则不需要)是十分必要的,对于 velocity 模板可采用 $encode.html (或者配置 ):

 

<textarea>
$encode.html($content)
</textarea>
 

同理 input !

 

 

PS3 &nbsp; 不间断空格问题

 

&nsbp; 属于 html 特有的命名实体,相当于 &#160; (不间断空格)。无论多少个 &nbsp; 并排放置都不会导致浏览器换行!

 

需要注意的是 ie 正则表达式下 \s 对于不间断字符存在 bug:

 

 

/^\s$/.test(String.fromCharCode(160))
// ie => false
// firefox/chrome => true

 

保险点需要写成:

 

 

/^[\s\xa0]$/.test(String.fromCharCode(160))
 

further reading :

 

html 实体字符值问题

 

html codes

分享到:
评论
1 楼 cnwander 2010-09-13  
“ 如上例的google,firefox提交"我"结果为:q=%26%2325105%3B ,%26为&,%23为#,25105为“我”的unicode码点值,%3b为;”
应该有误,印象中如果以get方式提交,地址栏中的编码,IE系列,FF是gbk编码,chrome是utf-8编码。

废弃的escape,听人说如果你想提交以页面本身编码的数据可以用它
因为encodeURIComponent会以utf-8编码
不过我测试,escape以utf-16(win下)编码,OMG

相关推荐

Global site tag (gtag.js) - Google Analytics