zoukankan      html  css  js  c++  java
  • php实现兼容Unicode文字的字符串大写和小写转换strtolower()和strtoupper()

    前言

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

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

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

    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 码相应值:

         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."
    ";
    echo 'result string:';
    $r = mystrtoupper($a);
    var_dump($r);
    
    
    


    输出结果 :

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


    大写转小写同理可得,不再赘述,完整两个方法的代码及使用,可下载:http://download.csdn.net/detail/agangdi/8171599

    当然了,编程是一门艺术。同一个功能有多种多样的实现方法。假设您有什么别的办法,能够尽情评论不吝赐教,假设读者认为该方法有什么不妥之后,也可随时指正。



  • 相关阅读:
    正则匹配 sql语句参数
    正则判断是不是移动端浏览
    .net 2.0 后台多线程
    Oracle 获取当天数据
    C# 图片转Base64
    Js FileReader图片加载
    KendoUI操作笔记
    Android Studio解析Json文件内容
    LitePal
    C#最基本的小说爬虫
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7003401.html
Copyright © 2011-2022 走看看