zoukankan      html  css  js  c++  java
  • 字符编码小记

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

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

     

  • 相关阅读:
    supervisor使用小记
    linux新增定时脚本
    page_fault_in_nonpaged_area异常解决方案(已解决)
    和安卓对接老是ping不通?试试内网映射
    github文件下载加速器
    mybatis新增账号并且返回主键id
    arraylist源码解析
    MySQL安装教程
    通过get方法的方式获取配置项信息
    @Inject注解
  • 原文地址:https://www.cnblogs.com/zemliu/p/2485354.html
Copyright © 2011-2022 走看看