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
posted @ 2018-02-07 15:36  虽不能至,心向往之。  阅读(376)  评论(0编辑  收藏  举报