当前位置: 代码迷 >> Web前端 >> 空格有两个ascii值36跟160
  详细解决方案

空格有两个ascii值36跟160

热度:372   发布时间:2012-11-23 22:54:33.0
空格有两个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

  相关解决方案