空格有两个ascii值36和160

     空格的ascii码值是多少?今天之前,我的回答肯定是0x20(十进制就是36)。但今天碰到的一个问题让我对空格有了新的认识。空格的ascii码还可能是160。

    碰到的问题是这样的:在某一文章页面中,发现存在一个包含空格的标签(手机 随拍),点击这个标签却搜索不到这篇文章 。这篇文章是从手机上发布的,随即试了从PC上发布文章发现是正常的。检查PC上和手机上发布文章的标签数据,发现:PC上发布的标签的空格的UTF8编码是两个字节0xc2a0,结合前一篇文章(NodeJS笔记:处理非utf8编码)的编码知识,得知对应的Unicode code point为U+00A0;手机上发布的标签的空格的UTF8编码是单字节的0x20,计算得对应的Unicode code point为U+0020。这样看来,两边发布的空格的unicode不一致。日志页面上tag的链接被URLEncoder编码过了,unicode为0x20的空格被编码成了'+',但是后端拿到这个+时却没法进行自动解码(+是合法的URL的一部分?),直接当成'+'了,相当于在搜索'手机+随拍',这样肯定是得不到正确的结果的。再来看一下PC直接发布的unicode为0xA0的空格,被URLEncoder后变成%C2%A0(utf8格式),传到后端自动还原成值为0xA0的空格,这样就避免了该问题。

    这个问题从后端来看,是因为unicode为20的空格没可逆地与'+'号进行转换导致的,与具体的应用服务器有关。即空格转化成+传到前端后,前端传给后端的+没有自动地进行转化成相应空格。可通过对标签进行强制URLDecoder来解决。

    再来看看浏览器是怎么产生unicode值为0xA0的空格的。经过分析与测试发现,无论是移动端浏览器还是PC浏览器,用户在input或者textarea敲空格键输入的‘空格字符’都是unicode值为0x20的空格。但是如果设置某节点.innerHTML=' ',再通过这个节点.innerText获取其内容,将会取到unicode值为0xA0的空格。即可见0XA0与 存在某种对应关系,在ajaxer的博客扒到一张好图刚好证明了这一点,他的这篇文章提到了0xA0在OP下的一个bug:innerHTML拿到的 变成了0xA0:

 

    再来总结一下:空格的ascii码值有两个:从键盘输入的空格ascii值为0x20;从网页上的 字符转化而来的空格ascii值为0xA0

 

引自:http://nodejs.lofter.com/post/3c14e_85efc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值