• php二进制安全的含义


    PHP里,有string的概念。
    string里,每个字符的大小为byte(与PHP相比,Java的每个字符为Character,是UTF8字符,C语言的每个字符可以在编译时选择)。
    byte里,有ASCII代码的字符,例如ABC,123,abc,也有一些特殊字符,例如回车,退格之类的。
    特殊字符很多是不能显示的。或者说,他们的显示方式没有标准,例如编码65到哪儿都是字母A,编码97到哪儿都是字符a,退格在有的地方显示成一个符号,在有的地方就会真的把前一个字符退掉。
    PHP 以C为基础,所以很多描述都是以C为对比。C的字符串里,一种经典的定义就是,以编码0作为字符串的结尾。那么,假设这样一个string,里面3个字符 的编码分别是97,0,97。那么,C里面如果有str_replace等效的函数, 利用它把97换成98,那么这个函数读取到0的时候,就认为已经结 束了,就会得到98,0,97。跟它对应的,PHP里的str_replace是二进制安全的,那么这个0不会被视为特殊的结束符号,于是结果就是 98,0,98。
    【二进制安全】在PHP文档里,基本就是这么一个意思:C语言里的功能类似的函数会对有的字符特别处理,而PHP这个函数对于所有字符一视同仁,不用担心会有特殊字符影响处理,特别不用担心编码0字符。

    二进制安全函数:

    例如:dirname

    解释二:

    在PHP中经常看到一些函数有个标识「binary safe」, 即二进制安全,这是个什么概念呢? 在一个字符串中会包含很多的字符,这其中就包括NULL。「binary safe」的函数会把它的输入字符串原封不动的进行处理;而非「binary safe」的函数是在底层直接调用C的字符串相关的函数,而这些函数处理一个字符串会把NULL后边的内容忽略掉。

    例子

    以下例子中,如果函数strlen是binary safe的话,我们将得到7;如果函数是非binary safe的话,我们将得到3 ,由于strlen是binary safe的,所以实际上以下的运行结果是7:

    <?php
    $str = "abcx00abc"; //x00为NULL
    echo strlen($str);  //7

    参考:http://weizhifeng.net/php-binary-safe.html
  • 相关阅读:
    cocos2d-x 3.0游戏实例学习笔记 《跑酷》第七步--物理碰撞检測(1)
    Android给定坐标计算距离
    LeetCode——Gray Code
    hdu 1203
    2015 年度新增开源软件排名TOP100
    compact处理流程分析
    ExtJs--06--Ext.WindowGroup相关方法简单使用
    android4.4的两个bug
    高阶MapReduce_1_链接多个MapReduce作业
    如何设置eclipse格式化xml代码时不自动换行
  • 原文地址:https://www.cnblogs.com/Alight/p/4164400.html
Copyright © 2020-2023  润新知