字符编码小记

  • 字符编码在内存中的存储

字符编码在内存中存储决定于文件保存的格式,如UTF-8或ANSI

    1. 对于UTF-8,在内存中每个中文字符占3个字节,每个英文字符占1个字节
    2. 对于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

 

原文地址:https://www.cnblogs.com/zemliu/p/2485354.html