登录  /  注册

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

php中文网
发布: 2016-06-23 13:44:57
原创
1339人浏览过

前言

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

PHP的strtolower()和strtoupper()函数在安装非中文系统的服务器下可能会导致将汉字转换为乱码,请写两个替代的函数实现兼容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      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 之间,由此可得出我们的程序:

<?phpfunction mystrtoupper($a){    $b = str_split($a, 1);    $r = '';    foreach($b as $v){        $v = ord($v);        if($v >= 97 &amp;&amp; $v  <p></p>  <p><br></p> 输出结果 :  <p></p>  <pre name="code" class="sycode">origin string:a中你继续F@#$%^&amp;*(BMDJFDoalsdkfjaslresult string:string(39) "A中你继续F@#$%^&amp;*(BMDJFDOALSDKFJASL"
登录后复制


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

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



智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号