记一次字符编码引起的bug

时间:2021-07-16
本文章向大家介绍记一次字符编码引起的bug,主要包括记一次字符编码引起的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的对应码。

  

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

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

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

  

  而ISO-8859-1是ASCII的扩展同时拥有两种空格所以看起来两个字符串的格式是一致的,但是实际上两个空格是不同字符的。

  这就导致字符截取时无法截取,导致出现了上述的问题出现,

  至此问题产生的原因就得到最终的解释了。

原文地址:https://www.cnblogs.com/lzh-jiu/p/15018975.html