zoukankan      html  css  js  c++  java
  • 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 .问题将迎刃而解.
    ------------------------------------------分割线--------------------------
      总结:可能只是一些小的细节问题.分析解决问题的过程是值得享受的.
  • 相关阅读:
    提取字符串中的数字
    监控mysql执行的sql语句
    maven打包跳过单元测试
    idea常用快捷键
    spring boot 从入门到精通(一)启动项目的三种方式
    git从入门到精通(三)(git 生成本地密钥的方法:windows)
    经典面试题
    vue 20道精选面试题
    Angular输入框内按下回车会触发其它button的点击事件的解决方法
    快速搭建angular7 前端开发环境
  • 原文地址:https://www.cnblogs.com/swordphp/p/2805047.html
Copyright © 2011-2022 走看看