为什么html要实体编码,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 编码提交到服务器去了(服务器是否会自动转换?待测)。

大家熟悉的 < > ,空白等对应有实体名 < ,>  ,实际上所有字符都对应有实体,只不过大多数字符只有 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

to insert literal code points into your regular expression.

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

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

例如: = 表示 = ,而 a 表示 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 以及写它在页面中指定的值可以编码也可以不编码,一般情况下效果差别不大:

b

b

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

xx

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

提交到数据库中,存的是 

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

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

而不是用户先前输入的

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

$encode.html($content)

同理 input !

PS3   不间断空格问题

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

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

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

// ie => false

// firefox/chrome => true

保险点需要写成:

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

further reading :

html 实体字符值问题

html codes

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值