补课简单说明下 ascii 码
我们知道,计算机内部,所有信息最终都是一个二进制值。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从00000000到11111111。
上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为 ascii 码,一直沿用至今。
man ascii
ascii 码前 33 个都是控制字符,比如我们最熟悉的换行,都是不可见的字符。
Oct Dec Hex Char Oct Dec Hex Char
────────────────────────────────────────────────────────────────────────
000 0 00 NUL '' 100 64 40 @
001 1 01 SOH (start of heading) 101 65 41 A
002 2 02 STX (start of text) 102 66 42 B
003 3 03 ETX (end of text) 103 67 43 C
004 4 04 EOT (end of transmission) 104 68 44 D
005 5 05 ENQ (enquiry) 105 69 45 E
006 6 06 ACK (acknowledge) 106 70 46 F
007 7 07 BEL 'a' (bell) 107 71 47 G
010 8 08 BS 'b' (backspace) 110 72 48 H
011 9 09 HT 't' (horizontal tab) 111 73 49 I
012 10 0A LF 'n' (new line) 112 74 4A J
从上面的表中可以看到八进制012和十六进制0A都表示换行
echo "abc12d";
echo "n";
echo "abcx0Ad";
echo "n";
echo "abcx0ad";
echo "n";
echo "abcnd";
echo "n";
输出结果
abc
d
abc
d
abc
d
abc
d
ascii 码第一个则表示空字符,所以执行
echo "abcd";
输出的就是abcd。到这里上面的长度计算想必大家都弄明白了吧。
这里再留个大家一个思考题,strlen和mb_strlen有什么区别?
有兴趣的可以看看我这篇博客
C 实验
#include <;
#include <;
int main(){
printf("%dn",strlen("abc")); // 3
printf("%dn",strlen("abc")); // 3
printf("%dn",strlen("abcd")); // 3
printf("%dn",strlen("abcdef")); // 3
}
通过上面的例子可以观察到及其以后都不在strlen的计算范围内。在C语言里字符串都以作为结束符。
#include <;
#include <;
int main(){
printf("%sn","abcdef"); // abc
}
所以,因为字符串中间有而影响程序逻辑和结果的情况,叫非二进制安全。
思考
通过上面的两个实验发现只有C里面我们才需要关注函数的二进制安全问题嘛,PHP 也会遇到类似的问题么?我怎么从来遇到过。下面两个例子。
案例1
<?php
echo date("Y/m/d");
案例来源:
在线执行结果
可以看出来date函数是把入参"0/m/d"去掉了,不过在 php7 里修复了该问题。
案例2
<?php
var_export(strcoll("ab","a"));
var_export(strcmp("ab","a"));
这两个函数都是比较字符串“大小”,strcoll 会根据环境变量 LC_COLLATE 所指定的文字排列次序来比较两字符串的大小,默认 LC_COLLATE 为"POSIX"或"C",strcoll() 和 strcmp() 一样根据ASCII比较字符串大小。
strcoll 函数是官方手册在线说明了的非二进制安全的函数。
课后思考
下面这个两个计算长度分辨是多少,下次课我们一起分析 php 和 c 里面单引号和双引号的区别。
<?php
echo strlen("123456");
echo strlen('123456');
本文为云栖社区原创内容,未经允许不得转载。
1.文章《〈什么是二进制字符串〉截断字符串或二进制怎样解决》援引自互联网,为网友投稿收集整理,仅供学习和研究使用,内容仅代表作者本人观点,与本网站无关,侵删请点击页脚联系方式。
2.文章《〈什么是二进制字符串〉截断字符串或二进制怎样解决》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
相关推荐
- . 现代买票为什么带上携程保险
- . 潮阳怎么去广州南站
- . 湖南马拉河怎么样
- . 烧纸为什么到三岔路口
- . 百色为什么这么热
- . 神州租车怎么样
- . 芜湖方特哪个适合儿童
- . 护肤品保养液是什么类目
- . 早晚的护肤保养有哪些项目
- . 女孩护肤品怎么保养的最好