天天看点

记一次字符编码引起的bug

  工作中一次同事让帮忙查看一个bug问题,问题的内容是有一串空间字符串

POLYGON ((533773.3184787547 3113107.2679840983,534179.6510204338 3113081.4478734056,533773.3184787547 3113107.2679840983))
           

  在转换为空间对象时报错,错误的提示是533773.3184787547 3113107.2679840983不是为正确的数字;

  在看到这个提示的时候第一时间想到的是字符串的截取出错了,应该是字符串的格式有问题。

  但是查了一遍格式没发现有什么问题,这时同事给我展示了另外一个可以正常转换的空间字符串

POLYGON ((533773.3184787546 3113107.267984098,534179.6510204336 3113081.447873405,533773.3184787546 3113107.267984098))
           

  我对照了一下除了坐标数据不一致格式是完成的一模一样;

  这时我想的是方便一做转换的dll文件来查问题的原因,最后因为内容有点都加上自己能力有限,这条路没走通。

  这时我是暂时没头绪是什么情况,把两个字符串都复制到vs code中看着发呆。

  无意中发现两个字符串中横纵坐标中的空格好像不一样,正常情况下选中一个字符vs code会自动将当前文件中相同的字符高亮显示;

  但是这里我选中上面那个字符串中的空格,同字符串的空格会高亮显示,但是下面字符串的空格却没有。

  于是我在代码中将两个字符串转为字节数组,确实发现两个空格的字节码不同一个是32一个是160,

  在ASCII码中32确实对应的是空格,但是没有160的对应码。

  

记一次字符编码引起的bug

  又查了一下Unicode码160对应的字符也与显示的字符不一致;

  这时想到这个数据是由浏览器提交,大多数浏览器默认使用ISO-8859-1编码的;

  查了ISO-8859-1对照表确实查到了160对应了一个空格  不间断空白符

 ,

记一次字符编码引起的bug