-
字符编码在内存中的存储
字符编码在内存中存储决定于文件保存的格式,如UTF-8或ANSI
- 对于UTF-8,在内存中每个中文字符占3个字节,每个英文字符占1个字节
- 对于ANSI,在内存中每个中文字符占的字节数是变长的(中文在ANSI里代表GB2312编码),每个英文字符占1个字节
-
字符编码在程序中的处理
参看如下代码,这个文件保存的格式是UTF-8,也就是说$str在内存中占了15个字节,而$str2在内存中占 5个英文*1字节+1个中文*3字节=8字节 这是背景
如图:
1 <html> 2 <body> 3 <?php 4 $str = '我擦了个去'; 5 $str2 = 'wlg啊qa'; 6 $sub = substr($str, 0, 15); //substr($str, 0, 15)表示要截取$str的15个字符长度,PHP认为每个字符占1字节,所以substr函数一共截取了15*1=15字节的内容,内存中$str共占15字节,正好全部截完,所以不会出现乱码,输出是'我擦了个去' 7 $mb_sub = mb_substr($str, 0, 5, 'utf-8'); //mb_substr($str, 0, 5, 'utf-8'),此处将字符串作为utf-8对待,我们要截取5个字符,utf-8每个中文字符占3字节,一共截取 3字节*5个字符=15字节,正好全部截完,也不会出现乱码,输出是'我擦了个去' 8 $mb_sub_e = mb_substr($str2, 0, 4, 'utf-8'); //mb_substr($str2, 0, 4, 'utf-8'),此处将字符串作为utf-8对待,我们要截取4个字符,utf-8每个英文字符占1字节,一共截取3个英文字符,1个中文字符也就是 1字节*3英文字符+3字节*1中文字符=6字节,正好截到'啊'字,故输出是'wlg啊' 9 echo $sub . '<br>'; //输出'我擦了个去' 10 echo $mb_sub . '<br>'; //输出'我擦了个去' 11 echo $mb_sub_e . '<br>'; //输出'wlg啊' 12 echo strlen($str2) . '<br>'; //默认每个字节是1个字符,$str2在内存中共占8个字节,故strlen认为共有8个字符,打印结果是8 13 echo strlen($str) . '<br>'; //strlen()函数认为每个字节为1个字符,所以strlen打印出来的长度就是字符串在内存中占的字节数,故打印结果是15 14 echo mb_strlen($str, 'utf-8') . '<br>'; //mb_strlen($str, 'utf-8')是使用utf-8编码计算的,他认为每个字符应该占3个字节,那么$str在内存中的 15字节/3字节=5个字符,故打印结果是5 15 ?> 16 </body> 17 </html>
页面输出
我擦了个去
wlg啊
我擦了个去
8
15
5