• 字符编码小记


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

    字符编码在内存中存储决定于文件保存的格式,如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

     

  • 相关阅读:
    js获取粘贴内容
    axios导出 exer
    Mac + IDEA + JRebel破解方法.
    富有魅力的git stash
    java web 下实现文件下载
    java23中设计模式
    高并发量网站解决方案
    Linux下拆分大文件
    Linux下jvm、tomcat、mysql、log4j优化配置
    cas单点登出
  • 原文地址:https://www.cnblogs.com/zemliu/p/2485354.html
Copyright © 2020-2023  润新知