php实现兼容Unicode文字的字符串大小写转换strtolower()和strtoupper()

前言

网上流传着这么一个腾讯笔试题:

PHP的strtolower()和strtoupper()函数在安装非中文系统的服务器下可能会导致将汉字转换为乱码,请写两个替代的函数实现兼容Unicode文字的字符串大小写转换。

举个例子,我们直接对中英文混排的字符串处理是会出乱码的,如:

1
2
3
4
php > $a 'abc中华ABC'
php > var_dump(strtoupper($a)); 
string(12) "ABCĸ?ō?ABC" 
php >

 我们知道中文在 UTF8 编码里是由3个字符组成的,那么换个思路,我们可以把一个中文当成3个字符来处理,同理再换个思路,在一个把小写英文转换成大写英文的函数里,我们要处理 的只有小写字母,那么我们就可以对一个字符串逐个字符进行处理,只处理小写字母,那么如何判断一个字符是小写字母呢,当然是用 ascii 码了,使用 linux 或者 mac os (实际上也为 linux 系统)的朋友可以直接使用命令 man ascii 查看字符 ascii 码对应值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
The decimal set: 
   
  0 nul    1 soh    2 stx    3 etx    4 eot    5 enq    6 ack    7 bel 
  8 bs     9 ht    10 nl    11 vt    12 np    13 cr    14 so    15 si 
 16 dle   17 dc1   18 dc2   19 dc3   20 dc4   21 nak   22 syn   23 etb 
 24 can   25 em    26 sub   27 esc   28 fs    29 gs    30 rs    31 us 
 32 sp    33  !    34  "    35  #    36  $    37  %    38  &    39  ' 
 40  (    41  )    42  *    43  +    44  ,    45  -    46  .    47  / 
 48  0    49  1    50  2    51  3    52  4    53  5    54  6    55  7 
 56  8    57  9    58  :    59  ;    60  <    61  =    62  >    63  ? 
 64  @    65  A    66  B    67  C    68  D    69  E    70  F    71  G 
 72  H    73  I    74  J    75  K    76  L    77  M    78  N    79  O 
 80  P    81  Q    82  R    83  S    84  T    85  U    86  V    87  W 
 88  X    89  Y    90  Z    91  [    92  \    93  ]    94  ^    95  _ 
 96  `    97  a    98  b    99  c   100  d   101  e   102  f   103  g 
104  h   105  i   106  j   107  k   108  l   109  m   110  n   111  o 
112  p   113  q   114  r   115  s   116  t   117  u   118  v   119  w 
120  x   121  y   122  z   123  {   124  |   125  }   126  ~   127 del 

 由 ascii 表我们看出英文小写字母的ascii 值在  97 ~ 122 之间,由此可得出我们的程序:

复制代码
    <?php  
    function mystrtoupper($a){  
        $b = str_split($a, 1);  
        $r = '';  
        foreach($b as $v){  
            $v = ord($v);  
            if($v >= 97 && $v<= 122){  
                $v -= 32;  
            }  
            $r .= chr($v);  
        }  
        return $r;  
    }  
      
      
    $a = 'a中你继续F@#$%^&*(BMDJFDoalsdkfjasl';  
    echo 'origin string:'.$a."\n";  
    echo 'result string:';  
    $r = mystrtoupper($a);  
    var_dump($r);  
复制代码

输出结果 :

origin string:a中你继续F@#$%^&*(BMDJFDoalsdkfjasl  
result string:string(39) "A中你继续F@#$%^&*(BMDJFDOALSDKFJASL"  

参考链接:https://www.cnblogs.com/wydchn/articles/4952205.html

转载于:https://www.cnblogs.com/lyFocus/p/8426949.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值