PHP学习笔记(7) 各种换行符和换行中的错误一则

 先说说换行和回车之间的区别和联系.要说这个得先说说这两个符号的来历:
在电脑没出现之前有一种东西叫做电传机.这东西每一秒钟可以输出10个字符.但是有个缺陷就是当一行结束的时候如果想换行.搭载笔头的小车需要0.2秒才能回到行的初始位置.那么在这0.2秒内传来的数据就会丢失.为了解决这个问题.科学家想出了一个办法.就是在每行结束的时候输入二个表示结束的标示.一个叫做换行.告诉机器另外起一行.一个是回车.告诉机器让搭载笔头的小车回到行的起始位置.而输入这两个字符所用的时间正好是0.2秒.
-------------------------华丽的分割线----------------------------------
换行和回车在近代的计算机里面的表示为
  换行->\n ASCII代码是10, 十六制为0x0A.   
  回车->\r 十进制ASCII代码是13, 十六进制代码为0x0D;
  这是两个不同的符号.
  在unix系统和linux系统里面.每行的结束标示是只有一个换行 即\n
    ---当时的存储介质成本很高.这样做的目的是为了节省存储空间.
  在mac和ios系统里面.每行的结束标示只有一个回车 即\r
    ---这个我就不知道是怎么想的了
  而在windows系统里面.继承了电传机的优秀传统.每行的结束部分为\r\n
  这样的直接结果是在mac和linux系统里面的文件拿到windows里面来会全部变成一行
  基于各个系统对行的不同表示法,在编程过程中就会出现很多意想不到的错误和BUG.
  下面就说我在实际工作中遇到的一件事情.
---------------------------------华丽的分割线----------------------------
  问题描述:开发了一套能够自动领取激活码的系统.但是由于系统内存分配的限制.每次只能录入10000行激活码.当有更多的激活码需要录入的时候.就要反复多次录入.在php程序中.使用explode();函数来分割录入的激活码.以\n作为分割符号.如果只录入一次的话.是没有问题的.但是如果录入两次.会出现实际上重复的一行.而在数据库中又不会进行排重.此时当有人领取到了重复的激活码将出现无法兑换情况.
  问题成因:经过反复推敲和诊断.总结出问题的成因如下.当录入第一批激活码的时候.由于是在windows平台下录入的.每行的结束处是\N\R两个字符.分割过程中 .每行存在数据库中的内容是激活码内容加上\r 当再次编辑的时候.实际显示出来的是每个"激活码+\r"但是\r在浏览器中是不可见字符.无法实现换行.并且由于在分割过程中使用\n分割.所以当重新编辑显示在前端过程中.在每行的结束部分又重新添加上\n来实现换行.但是最后一行并不是这个情况.因为使用implode()来连接字符串.所以在最后一行的时候依旧是\r结束的表示.并且并没有换行.此时为了实现换行.又重新在行结束位置输入了回车.此时最后一行的形式为:"激活码+\r+\r\n"   当再次点击提交的时候.由于是拿\n分割的,所以此时最后一行会被分割为"激活码+\r+\r".这与之前的最后一条激活码肉眼看去是一样的,但是实际上之前最后一条激活码是"激活码+\r".再次插入数据库的过程中.会出现两条最后一条激活码.因为对于数据库来说."激活码+\r+\r"与"激活码+\r"是两条不一样的数据.
  解决方法:这个问题可能对于一般人来说根本算不上什么问题.但是在实际工作中遇到了.就总结下.此时.只要修改explode的条件.把分割符修改为\r,\n,\r\n的数组就OK .问题将迎刃而解.
------------------------------------------分割线--------------------------
  总结:可能只是一些小的细节问题.分析解决问题的过程是值得享受的.
原文地址:https://www.cnblogs.com/swordphp/p/2805047.html